我正在尝试从双精度数中获取小数部分,这是我获取小数部分的代码
double decimalvalue = 23423.1234-23423.0;
0.12340000000040163
但是在减法之后,我期望十进制值为 0.1234,但我得到 0.12340000000040163。请帮助我了解这种行为以及是否有任何解决方法。
我正在尝试从双精度数中获取小数部分,这是我获取小数部分的代码
double decimalvalue = 23423.1234-23423.0;
0.12340000000040163
但是在减法之后,我期望十进制值为 0.1234,但我得到 0.12340000000040163。请帮助我了解这种行为以及是否有任何解决方法。
我建议你看看
您可以在浮点数中指定有限数量的值,但在表示的范围内可以指定无限数量的浮点数。
因此,某些浮点数无法以任何浮点/双精度数据类型精确表示。
处理您的特定问题的典型方法是避免直接相等比较,而是进行 epsilon 测试:查看预期值和计算值是否在彼此之间称为epsilon的某个小数字(与减去的值相比)内.
间接相关的是Machine Epsilon的概念,值得一看以获得完整的理解
这是一个舍入误差。在十进制中,您不能完美地表示给定位数(例如 15)的 1/3。在 base 2 中,还有很多你无法表示的东西,0.1234 恰好是其中之一。精度取决于比例,但双精度约为 15 位十进制数字。我建议查看http://en.wikipedia.org/wiki/IEEE_floating_point以了解有关浮点数的更多详细信息。
如果您正在尝试制作一个以 10 为底的系统(例如人类使用的计算器)并且您需要精确的结果,您应该使用 BCD。