首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算术表达式计算6.135157E-6而不是零

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

Stack Overflow用户
提问于 2012-02-06 17:21:18
回答 3查看 216关注 0票数 2

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

代码语言:javascript
复制
float private myMethod(float c){
    result = (float) (c+273.15);
}

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

但是当它得到值-273.15时,我得到的是6.1035157E-6而不是0

这一切为什么要发生?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-06 17:34:44

问题是273.15是一个双精度数,而不是一个浮点数,它们都不能精确地表示273.15。然而,由于它们具有不同的精度,因此它们实际上会四舍五入存储不同的数字。当加法完成时,c被转换为双精度型,这将能够存储273.15的浮点数表示。所以现在你有两个值几乎相同的双精度数,差值将不为零。

为了得到“更可预测”的结果,使用273.15f来确保计算过程中有浮点数。这应该可以解决这个问题,但你需要做的是阅读二进制浮点算术,以及它与我们在学校里学到的十进制算术有什么不同。

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

票数 6
EN

Stack Overflow用户

发布于 2012-02-06 17:33:54

计算机中的浮点计算是不准确的。你应该阅读一些关于浮点算术的知识来防止这样的错误。

票数 2
EN

Stack Overflow用户

发布于 2012-02-06 18:07:51

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

我假设你正在将它转换成一个字符串。完成此操作的方法在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

示例:

代码语言:javascript
复制
NumberFormat formater = NumberFormat.getNumberInstance()
formatter.setMaximumFractionDigits(4);
formater.format(myMethod(-273.15))

现在你应该得到0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9157912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档