减去双倍会得到错误的结果

Subtracting double gives wrong result

本文关键字:错误 结果      更新时间:2023-10-16

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

double  decimalvalue = 23423.1234-23423.0;
0.12340000000040163

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

我建议你看看

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

维基百科:IEEE 754

可以在浮点数

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

因此,某些浮点数不能在任何浮点/双精度样式数据类型中准确表示。

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

间接相关的是机器Epsilon的概念,值得一看才能全面了解

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

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