当存储在浮点中时,Java如何舍入整数
作者:互联网
这是一个经典问题:您的旧版代码实际上应该使用n个整数时使用浮点数.但是,更改代码中该变量的每个实例(或多个实例)非常昂贵.因此,您需要编写自己的舍入函数,该函数需要使用一堆参数来提高准确性并转换为整数.
因此,基本问题是,用Java编写浮点数时如何取整?经典示例是0.1,通常将其舍入为0.0999999999998(或类似的东西).但是,在Java中给定整数时,浮点数是否总是舍入到它可以表示的下一个值?是否舍入它的内部尾数以有效舍入其绝对值?还是只选择整数和新浮点数之间误差最小的值?
当String为“ 1234567890”之类的整数时,调用Float.parseFloat(String)时的行为也不同吗?当String是一个浮点数比Float可以存储的精度更高时,行为也相同.
请注意,我使用浮点数或引用Float,我将其与Double互换使用.与整数和长整数相同.
解决方法:
how do floating point numbers round when they are made in java?
当您使用构造(int)d时,Java会截断(四舍五入为零),其中d的类型为double或float.如果需要舍入到最接近的整数,可以使用下面的行:
int a = (int) Math.round(d);
the classic example is 0.1 what is often quoted as rounding to 0.0999999999998 (or something like that).
您提到的问题并不存在,整数可以精确地表示为double(对于-253和253之间的整数).如果您要舍入的数字来自应该产生整数但由于浮点舍入错误而可能没有的先前计算,则(int)Math.round(d)可能是您应该使用的解决方案.这意味着只要累积误差不超过0.5,您将获得正确的整数.
your legacy code uses a floating point when it should really be using n integer. But, its to expensive to change every instance of that variable (or several) in the code.
如果产生double d的计算仅是-,*和其他整数的计算,并且产生介于-253和253之间的中间结果,则d自动包含一个整数(这是精确的,因为涉及的浮点计算是精确的,并且整数,因为精确结果是整数),您可以使用更简单的(int)d进行转换.另一方面,如果涉及除法运算符或非整数操作数,则不要轻易更改d的类型,因为它会更改这些计算的结果.
Also is the behavior different when calling
Float.parseFloat(String)
when the String is an integer like"1234567890"
?
这将产生一个浮点数,其值是有理数1234567890中最接近的可表示单精度值.恰好是1234567936.0f.
And is the behavior also the same when String is a Floating point with more precision than the Float can store.
从技术上讲,“ 0.1”比Float可以存储的精度更高.同样,从技术上讲,前面的示例1234567890也比Float可以存储的精度更高.行为是相同的:Float.parseFloat(“ 0.1”)产生最接近有理数0.1的浮点数.
标签:floating-point,rounding,numbers,java 来源: https://codeday.me/bug/20191029/1959126.html