fengzhikang_java 2011-08-11 22:24
浏览 477
已采纳

为什么 System.out.println(1-0.1*9);的答案

System.out.println(1-0.1*9);
输出的结果按数学来算结果是:0.1 如果按从左到右来算也是8.1
但为什结果是0.09999999999999998 这是为什么了,这是什么运算????????????????

  • 写回答

5条回答 默认 最新

  • suziwen 2011-08-11 22:55
    关注

    首先
    2进制无法精确显示0.1

    0.1 你用ieee的浮点数标准怎么表示? 后52个字节是小数,第一个字节是符号,后面11个字节是阶码。2的负几次方的和加到一起是0.1? 答案是没有。楼主试一下 2.0-0.5这样的,算出来就是精确的了。因为0.5是2的-1次方。0.75这样的 2(-1)+2(-2)都是可以精确表示的。。。。如果你想让2.0-0.1准确的话,用bigdecimal来做即可。

    编译器在处理一个数据时,当一种类型数据无法用二进制数精确表示时,只能按照一种规则去找一个数代替(比如取最接近这个数的二进制数代替

    如果想让他精确可以这样

    [code="java"]System.out.printf("%.1f",2.0-1.1); [/code]

    或者

    [code="java"]
    BigDecimal a = new BigDecimal("2.0").subtract(new BigDecimal("1.1"));
    System.out.println(a);
    [/code]

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

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!