2012-01-31 95 views
2

将值27.8675309输入到IEEE 754 Converter的“十进制表示”字段中,将我输入的值更改为27.86753。同样,Java在解析具有相同值的字符串时会丢弃最后两位数字。为什么我的浮动被截断?

Float.parseFloat("27.8675309") // Results in a float value of 27.86753 

我不知道是什么IEEE转换器的“十进制表示”实际上是(它是一个浮动?),但我希望它给我最大的数字可能是:

  1. 是一个浮点值
  2. 不超过我进入
  3. 原值

我希望Java来以类似的方式表现,就是我希望的上述代码行返回一个浮点值等于27.8675308或者更接近我原始输入的浮点值,而不是只删除小数位。我在这里错过了什么?

+0

如果你需要更高的精度,或许'double'比'float'更好。 – 2012-01-31 17:37:21

+0

@typoknig“8675309”是一个巧合,还是与80年代的歌曲相吻合? – 2012-02-21 14:56:18

+0

不巧:-) – ubiquibacon 2012-02-22 11:54:58

回答

9

这是预期的。

如果你看看27.8675309二进制表示(27.867530822753906为双):

01000001110111101111000010110100 

下一个最高值是:

01000001110111101111000010110101 

这将产生27.867533(27.86753273010254为双)而下一个最低值是:

01000001110111101111000010110011 

其中产生27.867529(27.8675289 15405273为双)

目前根本没有足够的位在Float的尾数代表之间的任意值,让你的价值在小数四舍五入到27.867530

+1

前两个二进制数是相同的,但我想我明白你在说什么。 – ubiquibacon 2012-01-31 17:30:09

+0

oops - 纠正! – Alnitak 2012-01-31 17:31:43

+0

另外,我清楚地知道,这不是一个小数点以外的事情,它是浮点数的指数和/或尾数没有多少位的问题,是正确的吗?其他一些浮点值可能有5个以上的小数位吗? – ubiquibacon 2012-01-31 17:33:34

1

如参宿一中提到,您用尽了点。不过,您可以使用Double来获得更高的精确度。 Double实现64位IEEE 754浮点,而Float实现32位IEEE 754浮点。