Java 为什么我的浮点被截断?

Java 为什么我的浮点被截断?,java,floating-point,ieee-754,Java,Floating Point,Ieee 754,将诸如27.8675309之类的值输入计算机的“十进制表示法”字段,将更改我输入的值27.86753。同样,Java在解析具有相同值的字符串时会删除最后两位数字 Float.parseFloat("27.8675309") // Results in a float value of 27.86753 我不确定IEEE转换器的“十进制表示法”实际上是什么(它是浮点吗?),但我希望它能给我提供可能的最大数字,即: 是一个浮点值 不超过我输入的原始值 我希望Java以类似的方式运行,也就是说,我希

将诸如
27.8675309
之类的值输入计算机的“十进制表示法”字段,将更改我输入的值
27.86753
。同样,Java在解析具有相同值的字符串时会删除最后两位数字

Float.parseFloat("27.8675309") // Results in a float value of 27.86753
我不确定IEEE转换器的“十进制表示法”实际上是什么(它是浮点吗?),但我希望它能给我提供可能的最大数字,即:

  • 是一个浮点值
  • 不超过我输入的原始值
  • 我希望Java以类似的方式运行,也就是说,我希望上面的代码行返回一个等于
    27.8675308
    的浮点值,或者一个更大的浮点值,它更接近我的原始输入,而不是仅仅删除小数位。我在这里遗漏了什么?

    这是意料之中的

    如果查看27.8675309的二进制表示(27.867530822753906为双精度):

    下一个最大值是:

    01000001110111101111000010110101
    
    01000001110111101111000010110011
    
    其收益率为27.867533(双精度为27.86753273010254),下一个最低值为:

    01000001110111101111000010110101
    
    01000001110111101111000010110011
    
    收益率为27.867529(双倍收益率为27.867528915405273)


    浮点数的尾数中没有足够的位来表示介于两者之间的任何值,因此您的值将以十进制形式向下舍入到27.867530

    ,正如Alnitak提到的,您已经用完了位。不过,您可以使用
    Double
    来获得更高的精度
    Double
    实现64位IEEE 754浮点,而
    Float
    实现32位IEEE 754浮点。

    前两个二进制数是相同的,但我想我明白你的意思。另外,我很清楚,这不是小数点不足的问题,这是一个关于浮点的指数和/或尾数不再有位数的问题,对吗?其他一些浮点值的小数位数可能超过5位,对吗?@typoknig尾数的位数不多-这个数字足够小,指数无关紧要。是的,较小的数字可以有五位以上的小数,但不能超过7或8位有效数字。@Alnitak 27.8675309四舍五入到24位=11011.1101111000010101=27.86753082275390625。四舍五入到8位小数,即27.867531,而不是27.867530。对于7位数字,它是27.86753,但上一个浮点数(27.8675289154052734375)和下一个浮点数(27.8675327301025390625)也是27.8675753。为什么要将27.8675309四舍五入到7位,而将prev和next四舍五入到8位?@RickRegan在IEE754中,27不会是尾数的一部分-实际上你会有2^4*1.741720…如果你需要更高的精度,也许
    double
    float
    更好。@typoknig“8675309”是巧合还是出自那首80年代的歌曲?