2016-08-18 158 views
2

我的问题,简而言之,为什么浮点数的舍入误差只会在计算后显示出来,而不是存储文字?将十进制浮点数转换为二进制并返回

我的意思是这个 - 我知道由于从十进制转换为二进制和返回时浮动四舍五入误差引起的问题。

例如,在Java中:然后

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

C存储,而不是22.82472值22.824720000000003。

这是因为结果22.82472不能准确地存储在双精度型的有限二进制数字中。 然而,10.567和2.16(即a和b)都不是。

但是,如果我打印的a和b的值,他们打印出来,没有任何舍入误差。为什么舍入错误不会显示在这里?

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

+0

它的输出格式化。例如。在C#中''c.ToString()'''c.ToString(“R”)'(''R''强制.Net返回所有位而没有任何向上取整)时将返回'22.82472''将返回'22.824720000000003' –

+1

@DmitryBychenko我尝试使用Java格式化c作为String,它仍然返回22.824720000000003。 –

回答

6

文字转换中存在四舍五入错误,它恰好隐藏在您的面前。 10.567不能以二进制来表示,所以而是舍入到最接近的可表示double值,它是

10.56700000000000017053025658242404460906982421875

然而,而非打印的确切值(这将是相当恼人),算法打印最少可能的数字,如果它被转换回二进制它会给出相同的值(在这种情况下是“10.567”)。

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

相关问题