关于Double(float)浮点数

import java.math.*;
public class DoubleTest{
public static void main(String args[]){
        System.out.println(4.015*100);
        System.out.println("BigDecimal:"+(BigDecimal.valueOf(4.015)).multiply(BigDecimal.valueOf(100)));

    }
}


结果为:401.49999999999994
              BigDecimal:401.500


在程序中单纯的用float 或 double 来进行多次计算很有可能出现上述问题,可是为什么会出现此问题呢?

原因是浮点数的表示是用二进制表示的,其中float占4字节(有效数字6-7位),double占8字节(有效数字15位)。


浮点数结构(float/double)

符号位(S):1bit指数位(E):8bit
尾数位(M):23bit

符号位(S):1bit指数位(E):11bit尾数位(M):52bit

float的尾数:23位,其范围为:0~ 223 ,而 223=8388608=106.92 ,所以float的精度为6~7位,能保证6位为绝对精确,7位一般也是正确的.

double的尾数:52位, 252 =2.220446049250313E-16,最小是16位,但最小不是1.0E-16,所以精度是15~16,能保证15,一般16位。


不理解的话,可以再这样想:folat 尾数位23位,二进制0101……0101,尾数表示小数位,最小为0000……0001(22个0,最后一个1),即 223 =1.1920929E-7 ,这是float的最小单元(大概是0.0000001192大小,你想表示比这更小的,比如0.00000001,不可能啊),这是一个7位小数位小数,最小就是这么小,比这个更小的,计算机就无能为力了,比这个更大的,每次通过加这么一个最小单元,直到相等或接近(两个相差一个最小单元的数,它们之间的数也是不能表示的,所以有的7位也是不能精确的,因为最小不是0.0000001,而是比这个稍大)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值