从1-0.9不等于0.1说起——计算机中的浮点数

  初学Java时,在关于浮点数的各种资料中都会看到类似的说明:“浮点数在计算时极易产生微小的误差”,“在要求绝对精确的业务场景下,禁止使用浮点数计算”等等。可以做一个最简单的验证:

System.out.println("1-0.9f="+(1-0.9f));

  控制台输出:

1-0.9f=0.100000024

  本文主要说明两个问题:

  1. 为什么浮点数在计算中不精确?
  2. 浮点数的优缺点及应用思路

一、为什么浮点数在计算中不精确?

  《The Java® Language Specification(Java语言规范)》JavaSE8版中明确提到,浮点数float和double符合IEEE-754标准的单精度32位和双精度64位格式。

4.2.3. Floating-Point Types, Formats, and Values
The floating-point types are float and double, which are conceptually associated with the single-precision 32-bit and double-precision 64-bit format IEEE 754 values and operations as specified in IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985 (IEEE, New York).

Oracle官方文档-《The Java® Language Specification》Java SE 8 Edition
IEEE-754标准文件

  1. 浮点数的二进制表示

  按照IEEE-754标准,以32位浮点数(float)为例,从高位到低位依次为:符号位(1位)+阶码位(8位)+尾数位(23位),实际浮点数值为:
± 尾 数 ∗ 2 阶 码 \pm 尾数*2^{阶码} ±

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值