程序中算钱不能用浮点类型是个什么坑?

简介: 一分钟涨姿势系列
阅读本文大概需要 1 分钟。

先来考考大家,在下列 Java 代码中,你觉得在控制台会打印什么值呢?

16a5774d76e36a29?w=534&h=427&f=png&s=177

貌似难不倒大家,这不是 so easy ,连小学生都会算的题目,1.0 - 0.9 = 0.1 啊,但是你觉得会等于 0.1 吗?

看下上图代码的输出结果:

16a5774d7aa276e8?w=434&h=132&f=png&s=339

有没有惊讶,有没有很刺激,0.0……02 难道被计算机吃掉了???

好吧,当初我也是这幅表情(原谅我基础薄弱)。

那如果我们将其换成 float 类型的会怎么样呢?再来试试。

16a5774d7af0f304?w=529&h=316&f=png&s=142

控制台打印结果:

16a5774d7b4573a7?w=384&h=131&f=png&s=329

结果居然多了 0.10…24,那不得乐开花啊~

那么以上这些现象是为什么呢?

浮点数在计算机中采用二进制表示,而二进制系统无法精确表示某些小数,比如 1/10 ,就像十进制无法表示 1/3 一样,这样是产生误差的原因。

在企业开发中,当涉及到钱的计算时应该使用 BigDecimal 类型来处理,尤其是在金融领域,只要和钱有关的任何逻辑,都是大事,反之没那么严重(只是没那么大)。


·END·

程序员的成长之路

路虽远,行则必至



相关文章
浮点类型
Julia 支持 Float16, Float32, 和 Float64 浮点类型,分别对应半、单、双精度,以及16、32、64比特。复数和有理数基于这些构建。浮点字面量可写为1.0、1.、0.5等形式,或用E表示科学记数法,如1e10、2.5e-4,其中E代表指数。
|
9月前
|
存储 Go
Go 语言的基础数据类型:整数类型、浮点数类型、布尔类型、字符串类型等
Go 语言的基础数据类型:整数类型、浮点数类型、布尔类型、字符串类型等
61 0
Go 语言的基础数据类型:整数类型、浮点数类型、布尔类型、字符串类型等
|
存储 Java
简自动类型提升,精度损失类型强制转换,常用转义字符,简单帮你回顾Java基本数据类型整形浮点型字符型布尔型Boolean及其运算规则
简自动类型提升,精度损失类型强制转换,常用转义字符,简单帮你回顾Java基本数据类型整形浮点型字符型布尔型Boolean及其运算规则
142 1
简自动类型提升,精度损失类型强制转换,常用转义字符,简单帮你回顾Java基本数据类型整形浮点型字符型布尔型Boolean及其运算规则
|
10月前
|
存储 Linux 网络安全
git教程
git教程
121 0
|
4月前
|
Java 应用服务中间件
Springboot启动的时候初始化的线程池默认配置tomcat
Springboot启动的时候初始化的线程池默认配置tomcat
97 1
|
9月前
|
开发工具 数据安全/隐私保护 iOS开发
windows电脑创建ios证书和证书profile文件
windows电脑并没有mac的钥匙串工具去创建ios打包证书,也没有mac的xcode工具去上架ios应用,那么假如只有windows电脑能否使用uniapp开发和打包ios的app呢?是可以的,没有mac电脑,我们可以使用香蕉云编去创建ios证书。
162 0
windows电脑创建ios证书和证书profile文件
|
11月前
|
Web App开发 前端开发 iOS开发
快来让你的网页色彩绚丽--linear-gradient与radial-gradient
CSS属性 linear-gradient 与 radial-gradient
180 0
快来让你的网页色彩绚丽--linear-gradient与radial-gradient
|
9月前
|
Docker 容器
Harbor:修改默认的172网段
Harbor:修改默认的172网段
171 0
|
11月前
|
人工智能 安全 数据安全/隐私保护
团队协作工具Slack介绍
团队协作工具Slack介绍
223 0