3

我正在尝试从双精度数中获取小数部分,这是我获取小数部分的代码

double  decimalvalue = 23423.1234-23423.0;
0.12340000000040163

但是在减法之后,我期望十进制值为 0.1234,但我得到 0.12340000000040163。请帮助我了解这种行为以及是否有任何解决方法。

4

2 回答 2

8

我建议你看看

每个计算机科学家都应该知道的关于浮点运算的知识

维基百科:IEEE 754

您可以在浮点数中指定有限数量的值,但在表示的范围内可以指定无限数量的浮点数。

因此,某些浮点数无法以任何浮点/双精度数据类型精确表示。

处理您的特定问题的典型方法是避免直接相等比较,而是进行 epsilon 测试:查看预期值和计算值是否在彼此之间称为epsilon的某个小数字(与减去的值相比)内.

间接相关的是Machine Epsilon的概念,值得一看以获得完整的理解

于 2012-10-02T23:43:45.380 回答
3

这是一个舍入误差。在十进制中,您不能完美地表示给定位数(例如 15)的 1/3。在 base 2 中,还有很多你无法表示的东西,0.1234 恰好是其中之一。精度取决于比例,但双精度约为 15 位十进制数字。我建议查看http://en.wikipedia.org/wiki/IEEE_floating_point以了解有关浮点数的更多详细信息。

如果您正在尝试制作一个以 10 为底的系统(例如人类使用的计算器)并且您需要精确的结果,您应该使用 BCD。

于 2012-10-02T23:42:42.143 回答