为什么在处理金额时不能用Double和Float,计算机是如何存储浮点数的 您所在的位置:网站首页 java金额计算数据精度 为什么在处理金额时不能用Double和Float,计算机是如何存储浮点数的

为什么在处理金额时不能用Double和Float,计算机是如何存储浮点数的

#为什么在处理金额时不能用Double和Float,计算机是如何存储浮点数的| 来源: 网络整理| 查看: 265

浮点数的存储模式 前言1. 十进制和二进制的转换1.1 十进制转二进制1.2 二进制转十进制 2. 科学计数法3. 浮点数格式3.1 为什么不能用浮点数存储金额 4. 移码4.1 机器中所使用的偏移量4.2 为什么要使用移码4.3 为什么不是2^n-1^ 参考材料

前言

码出高效这本书以前翻到浮点数这一页的时候随便看一下过了就过了,最近再次开始翻,才发现浮点数这个东西其实并没有想象中这么简单,于是写一篇文章记录一下。

想要弄懂浮点数的存储方式,要先有三个前置技能点,科学计数法,进制转换和移码,我会在本文一起介绍这三点。

1. 十进制和二进制的转换

在介绍如何存储之前,我们要先对进制转换有一个比较清晰的认知,当然这里所说的进制转换主要是要介绍小数的进制转换,整数部分就不介绍了。

1.1 十进制转二进制

方法:将小数乘以2,取出整数部分作为二进制的第一位,小数部分继续乘以2,再次取出整数部分作为第二位;反复执行这个操作直到小数部分为0。

举例1,0.625转换成二进制:

0.625 * 2 = 1.25 1 0.25 * 2 = 0.50 0 0.50 * 2 = 1.00 1 所以0.625转为二进制为0.101

举例2,0.6转换成二进制:

0.6 * 2 = 1.2 1 0.2 * 2 = 0.4 0 0.4 * 2 = 0.8 0 0.8 * 2 = 1.6 1 0.6 * 2 = 1.2 1 .... 你会发现对于小数0.6而言,他是永远都乘不尽的,会出现无限循环小数的情况。 所以0.6转为二进制为0.1001 1001 1001 ....... 1.2 二进制转十进制

方法:二进制中每一个位数的值乘以2的X次方,X为位数所在的位置,小数点前一位(个位数)的位置为0。

举例1,1011.101转为十进制: = 1 * 23 + 0 * 22 + 1 * 21 + 1 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3 = 8 + 0 + 2 + 1 + 0.5 + 0 + 0.125 = 11.625。

举例2,0.1001 1转为十进制: = 1 * 2-1 + 0 * 2-2 + 0 * 2-3 + 1 * 2-4 + 1 * 2-5 = 0.5 + 0 + 0 + 0.0625 + 0.03125 = 0.59375。 你会发现0.6转为二进制后,再转回十进制,是永远得不到0.6的值,只能无限接近(例子只取了前五位)。

2. 科学计数法

在日常生活中,如果我们需要记一个非常大或者非常小的数字,经常会使用科学计数法来表示,比如说光的速度近似于3.0 * 108 m/s;我们国家人口大概有1.4 * 109人。科学计数法可以表达方式如图所示: 在这里插入图片描述

有效数字部分的大小为:1 BigDecimal bigDecimal = new BigDecimal(3.51); System.out.println(bigDecimal); // 3.5099999999999997868371792719699442386627197265625 BigDecimal bigDecimal1 = new BigDecimal("3.51"); System.out.println(bigDecimal1); // 3.51 } } 4. 移码

最后再来说一下移码,移码是专门用于表示浮点数中阶码位部分(也就是指数部分)的值,具体的表示方式为: [X]移 = 2n-1 + X(-2n-1



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有