iteye_3068 2009-10-16 10:12
浏览 515
已采纳

java 中double数减法问题

代码如下:
[code="java"]
public class TestMath {
public static void main(String[] args) {
double aa = 87.5;
double bb = 87.6;
System.out.println(100-aa);
System.out.println(100-bb);
}
}
[/code]
输出结果是:
12.5
12.400000000000006
有解释吗?

  • 写回答

3条回答 默认 最新

  • iteye_20589 2009-10-16 10:17
    关注

    [url]http://www.iteye.com/problems/26677[/url]
    JAVA解惑一书:
    [quote]public class Change{
    public static void main(String args[]){
    System.out.println(2.00 - 1.10);
    }
    }
    你可能会很天真地期望该程序能够打印出0.90,但是它如何才能知道你想要打
    印小数点后两位小数呢?
    如果你对在Double.toString 文档中所设定的将double 类型的值转换为字符串
    的规则有所了解,你就会知道该程序打印出来的小数,是足以将double 类型的
    值与最靠近它的临近值区分出来的最短的小数,它在小数点之前和之后都至少有
    一位。因此,看起来,该程序应该打印0.9 是合理的。
    这么分析可能显得很合理,但是并不正确。如果你运行该程序,你就会发现它打
    印的是0.8999999999999999
    问题在于1.1 这个数字不能被精确表示成为一个double,因此它被表示成为最
    接近它的double 值。该程序从2 中减去的就是这个值。遗憾的是,这个计算的
    结果并不是最接近0.9 的double 值。表示结果的double 值的最短表示就是你所
    看到的打印出来的那个可恶的数字。
    更一般地说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示的。[/quote]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法