算术表达式计算6.135157E-6而不是零

时间:2012-02-06 09:21:18

标签: java android math zero

我的应用程序中有以下代码

float private myMethod(float c){
    result = (float) (c+273.15);
}

当“c”得到类似-273.1455的值时,结果非常接近零,如0.0044。

但是当它得到-273.15的值时我会得到这个而不是零:6.1035157E-6

为什么会这样?

3 个答案:

答案 0 :(得分:6)

问题是273.15是双重的,而不是浮点数,它们都不能完全代表273.15。但是,由于它们具有不同的精度,因此它们将实际存储不同的数字。当完成加法时,c被转换为double,这将能够存储273.15的浮点表示。所以现在你有两个具有几乎相同值的双打,差异将不为零。

要获得“更可预测”的结果,请使用273.15f以确保您在计算中有浮动。这应该可以解决这个问题,但你需要做的是阅读二进制浮点算术,以及它与我们在学校教授的十进制算术的区别。

Wiki on floating point是一个很好的起点。

答案 1 :(得分:2)

计算机中的浮点计算不准确。您应该阅读有关浮点算术的内容以防止此类错误。

答案 2 :(得分:0)

问题不在于值,而在于显示给用户。

我假设您正在将其转换为String。完成此操作的方法详见http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Double.html#toString(double

要显示正确的值,请使用NumberFormat类http://docs.oracle.com/javase/1.4.2/docs/api/java/text/NumberFormat.html

示例:

NumberFormat formater = NumberFormat.getNumberInstance()
formatter.setMaximumFractionDigits(4);
formater.format(myMethod(-273.15))

现在你应该得到0。