为什么我的浮动被截断了?

时间:2012-01-31 17:17:10

标签: java floating-point ieee-754

IEEE 754 Converter的“十进制表示”字段中输入27.8675309之类的值会将我输入的值更改为27.86753。同样,当解析具有相同值的字符串时,Java会丢弃最后两位数字。

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

我不确定IEEE转换器的“十进制表示”实际上是什么(它是浮点数吗?)但是我希望它能给出最大的数字:

  1. 是浮动值
  2. 不超过我输入的原始值
  3. 我希望Java能够以类似的方式运行,也就是说,我希望上面的代码行返回一个等于27.8675308的浮点值或一个更接近原始输入的浮点数值而不只是删除小数位。我在这里缺少什么?

2 个答案:

答案 0 :(得分:9)

这是预期的。

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

01000001110111101111000010110100

下一个最高值是:

01000001110111101111000010110101

产生27.867533(27.86753273010254为双),下一个最低值为:

01000001110111101111000010110011

得到27.867529(27.867528915405273为双)

Float的尾数中没有足够的位来表示其间的任何值,因此您的值以十进制向下舍入为27.867530

答案 1 :(得分:1)

正如Alnitak所说,你已经用完了。但是,您可以使用Double来获得更高的精度。 Double实现64位IEEE 754浮点,而Float实现32位IEEE 754浮点。