binary - 十进制 float 与二进制的相互转换

标签 binary floating-point decimal precision floating-accuracy

简而言之,我的问题是,为什么 float 中的舍入误差仅在计算后出现,而不是在存储文字时出现?

我的意思是 - 我知道在十进制与二进制相互转换时由于 float 的舍入误差而出现的问题。

例如,在 Java 中:

double a = 10.567;
double b = 2.16;
double c = a * b;

c 然后存储值 22.824720000000003,而不是 22.82472。

这是因为double类型的有限二进制数无法准确存储结果22.82472。 但是,10.567 和 2.16(即 a 和 b)也不能。

但是如果我打印 a 和 b 的值,它们会被准确地打印出来,没有任何舍入误差。为什么这里没有显示舍入误差?

这是否意味着浮点文字的表示与浮点计算结果的表示有所不同?

最佳答案

文字转换中存在舍入误差,它恰好对您隐藏。 10.567 无法用二进制表示,因此它会四舍五入到最接近的可表示的 double 值,即

10.56700000000000017053025658242404460906982421875

但是,该算法不是打印确切的值(这会相当烦人),而是打印尽可能少的数字,这样如果将其转换回二进制,它将给出相同的值(在本例中为“10.567”) .

事实证明,对于double,您可以对最多 15 位的任何小数执行此操作,请参阅 http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/ .

关于binary - 十进制 float 与二进制的相互转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39011905/

相关文章:

转为二进制。读入数据片给出零结果

java - 添加二进制数,如 Java 中的十进制数。例如 0101 + 0110 = 0211

c - 如何将 char 数组转换为 float 并检查其范围?

c - C语言中如何分别对小数点前后的数字求和?

c# - 为什么 IsLiteral 对十进制返回 false?

assembly - 二进制到BCD转换

c - 作为二元运算的数学函数

C# NotFiniteNumberException 不起作用

c++ - 如何让69.99*100打印6999而不是6998?

c - 如何显示 Float64 类型的数字,最多仅显示一位小数