浮动和双重问题混淆 - Java [重复]

Posted

技术标签:

【中文标题】浮动和双重问题混淆 - Java [重复]【英文标题】:Float and Double question confusion - Java [duplicate] 【发布时间】:2021-08-09 19:17:49 【问题描述】:
double basicPay = 1999.0;
        double hra = 145.0;
        float experience = 3.0f;
        double percentage;
        if(experience<3)percentage = 0;
        else if(experience>=3 && experience<5)percentage = 5;
        else if(experience>=5 && experience<10)percentage = 7;
        else percentage = 12;
        double salary = (basicPay + hra + basicPay*(percentage/100));
        System.out.println(salary);

这显示输出为 2243.95

如果我改变了

double salary = (float)(basicPay + hra + basicPay*(percentage/100));

现在的答案是 2243.949951171875

为什么会这样?

【问题讨论】:

【参考方案1】:

这是与 Java 无关的问题,而是与浮点数标准及其精度有关的问题。并非所有数字都可以用float 表示。浮点将获得一个与浮点格式的实际值最接近的值,而不是精确值。 double 有更多字节来存储数据,因此更精确。

我不会解释整个事情,因为我相信有很多资源可以很好地解释它,google floating point precision

【讨论】:

Java 在这里负部分责任;其默认输出 2243.95 不显示计算的真实值。如果是这样,人们会更清楚这两种计算都包含舍入误差。

以上是关于浮动和双重问题混淆 - Java [重复]的主要内容,如果未能解决你的问题,请参考以下文章

被java语法混淆[重复]

Java Array声明混淆[重复]

混淆:隐藏java中的硬编码值[重复]

将对象引用传递给java混淆中的方法[重复]

在 Java 中浮动到货币

我喜欢从双重列表中消除重复的组件,然后合并双重列表