这是一个经典的问题:您的旧代码实际上应该使用n个整数时使用浮点数。但是,更改代码中该变量的每个实例(或多个实例)非常昂贵。因此,您需要编写自己的舍入函数,该函数需要使用一堆参数来提高准确性并转换为整数。
因此,基本问题是,用Java编写浮点数时如何取整?经典示例是0.1,通常将其舍入为0.0999999999998(或类似的东西)。但是,在Java中给定整数时,浮点数是否总是舍入到它可以表示的下一个值?是否舍入它的内部尾数以有效舍入其绝对值?还是只是选择整数与新浮点数之间误差最小的值?
当String是类似于Float.parseFloat(String)
的整数时,调用"1234567890"
时的行为也不同吗?当String是一个浮点数比Float可以存储的精度更高时,行为也相同。
请注意,我使用浮点数或引用Float,我将其与Double互换使用。与整数和长整数相同。
最佳答案
用Java制作浮点数时如何取整?
当您使用(int) d
结构类型d
或double
时,Java会截断(四舍五入到零)。如果需要舍入到最接近的整数,可以使用下面的行:
int a = (int) Math.round(d);
经典示例是0.1,通常将其舍入为0.0999999999998(或类似的东西)。
您提到的问题并不存在整数,整数可以精确地表示为
float
(对于-253和253之间的整数)。如果您要舍入的数字来自应该产生整数但由于浮点舍入错误而可能没有的先前计算,那么double
可能是您应该使用的解决方案。这意味着只要累积误差不超过0.5,您将获得正确的整数。您的旧版代码实际上应该使用n个整数时使用浮点数。但是,更改代码中该变量的每个实例(或多个实例)非常昂贵。
如果产生
(int) Math.round(d)
double
的计算只是具有其他整数的d
,+
,-
的计算,并产生-253到253之间的中间结果,则*
自动包含一个整数(这是精确的,因为涉及的浮点计算是精确的,并且是一个整数,因为精确的结果是一个整数),您可以使用更简单的d
对其进行转换。另一方面,如果涉及除法运算符或非整数操作数,则不应轻易更改(int) d
的类型,因为它会更改这些计算的结果。当String是类似于
d
的整数时,调用Float.parseFloat(String)
时的行为也不同吗?这将生成一个
"1234567890"
,其值为最接近有理1234567890的可表示单精度值。这恰好是float
。当String是一个浮点数比Float可以存储的精度更高时,行为也相同。
从技术上讲,“0.1”比
1234567936.0f
可以存储的精度更高。同样,从技术上讲,前面的示例1234567890也比Float
可以存储的精度更高。行为是相同的:Float
产生最接近有理数0.1的Float.parseFloat("0.1")
。