首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JAVA中的双精度

JAVA中的双精度
EN

Stack Overflow用户
提问于 2011-11-18 13:16:01
回答 2查看 3.6K关注 0票数 1

我必须将我的结果舍入到最近的fo 0.05,即6.34到6.35和6.37到6.4之间,所以我创建了myRound函数。当我编写测试来查看函数时,它失败了。

代码语言:javascript
运行
复制
double rate=14.99;
double  percentage=10;
double roundedCost=(rate*percentage)/100; //round off to the nearest value. 
double finalRate = rate+myRound(roundedCost,2);

if(finalRate==16.49)
    System.out.println("Its proper");
else
    System.out.println("Wrong");

究其原因,是双倍的裂变值。如何修正精度.

代码语言:javascript
运行
复制
public double myRound(double value,int roundRange)
{
    double hundredMultiple=(float) Math.pow(10, roundRange);
    int rangeValue= (int) (value*hundredMultiple);
    int tempValue= rangeValue%10;
    if(tempValue<5)
        tempValue=5-tempValue;
    else
        tempValue=10-tempValue;
    rangeValue=rangeValue+tempValue;

    return rangeValue/hundredMultiple;

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-18 14:22:32

一个更短的功能就是去做。

代码语言:javascript
运行
复制
public static double round(double v, int precision) {
     long t = TENS[precision]; // contains powers of ten.
     return (double) (long) (v > 0 ? v * t + 0.5 : v * t - 0.5) / t;
}

这适用于小于18个有效数字的数字(超过您的精度),例如,对于小数点2位,数字应该小于10^16。

顺便说一句,你应该总是绕开最后的答案(可能只是最后的答案)。这是因为x + round(y, 2)可能不等于round(x + y, 2)

票数 0
EN

Stack Overflow用户

发布于 2011-11-18 13:22:45

问题是,您正在尝试执行对十进制数字感兴趣的操作。这不适合二进制浮点类型。您应该使用BigDecimal,它是基于十进制的表示形式.

就像你想知道为什么你现在的计划行不通一样,如果你写:

代码语言:javascript
运行
复制
double d = 0.1;

d的值实际上不是0.1 --它是与0.1最接近的64位IEEE754二进制浮点值。它的值将非常接近于0.1,但不会是0.1。

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

https://stackoverflow.com/questions/8182994

复制
相关文章

相似问题

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