文档章节

踩坑:js 小数运算出现精度问题

dkvirus
 dkvirus
发布于 01/17 18:13
字数 405
阅读 14
收藏 0

背景

在学习小程序商城源码时发现了这个问题,单价可能出现小数,小数之间运算结果会莫名其妙多出一大串数字,比如下面这样👇。

小数运算精度丢失

在此之前我是知道 js 中著名的 0.1 + 0.2 != 0.3 的问题的,可是在自个写项目时压根从来没注意过小数运算可能出现的问题。写这篇文章希望以后能牢记于心。

小数运算并不总会丢失精度

上面可以看到 并不是所有小数运算都会出现精度丢失问题,小数运算为什么会出现精度丢失?

原因

小数转二进制规则

上面是小数转二进制规则,对 0.1 做运算之后得到

0.000 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 (1100)......

后面 1100 是无限循环的,计算机存储数据会给指定大小,比如 double 类型会给 64 个字节来存储,这就意味着上面那串数字得截取,变成了:

0.000 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101

注意看最后四位本来是 1100,因为截取变成了 1100。(在线进制转换可以验证结果)

运算精度出现问题的根本原因也就在于此。

© 著作权归作者所有

共有 人打赏支持
dkvirus
粉丝 29
博文 117
码字总数 115533
作品 0
六安
程序员
私信 提问
JavaScript 浮点数运算的精度问题

在 JavaScript 中整数和浮点数都属于 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此。 所以我们在打印 这样的浮点数的结果是 而非 。在一些特殊的数值表示中,例如金额,...

xiaogg
01/07
0
0
JS四则运算与四舍五入精度问题及解决方案

一、Javascript精度问题业务背景 JS中 0.1+0.2 = 0.3000000000000004的问题,在很多业务场景里都是一个令人头痛的问题。尤其是在大型的电商企业,货币基金股票行业的网页中,JS四则运算和toF...

StevenLikeWatermelon
2018/11/06
0
0
JavaScript 四则运算(加减乘除小数运算)避免损失精度

在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,...

IceRainYWC
2013/01/22
0
4
0.1 + 0.2不等于0.3?为什么JavaScript有这种“骚”操作?

写在前面 随着消费观念的改变,线上消费已经成为大众生活中不可或缺的一部分。在保证消费安全和用户隐私的同时,精准度也是必不可少的一环。试想一下,用户在一款产品上消费,结算金额出错,...

Gladyu
2018/09/17
0
0
0.1+0.2 !== 0.3?

前言 众所周知,JavaScript在计算某些浮点数的运算时会出现精度的丢失,比如你在控制台输入,得到的结果是而不是,原因是什么? 世界上有两种人,懂二进制和不懂二进制的人 我们知道,计算机...

ShuaiKangZhang
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习设计模式之路

https://java-design-patterns.com/patterns/ https://www.oodesign.com/ https://www.programering.com/a/MTNxAzMwATY.html https://design-patterns.readthedocs.io/zh_CN/latest/ https:/......

晨猫
今天
1
0
JDK1.8 jar包说明

JDK 1.8 lib:access-bridge-64.jarcharsets.jarcldrdata.jardeploy.jardnsns.jarjaccess.jarjavawa.jarjce.jarjfr.jarjfxrt.jarjfxswt.jarjsse.jarlocaledata.jar......

冷基
今天
1
0
判断用户的icloud是否开启【Swift4.2】

使用icloudkit存储用户私人数据时,必须判断用户的icloud是否开启【Swift4.2】 func isICloudContainerAvailable()-> Bool { if FileManager.default.ubiquityIdentityToken != ni......

叶落花开
今天
2
0
今天的学习

1、执行git add *命令就把改动提交到了暂存区,执行git pull命令将远程仓库的数据拉到当前分支并合并,执行git checkout [branch-name]切换分支 2、执行git commit -m '说明' 命令就把改动提...

墨冥
昨天
0
0
Android4.4 及以下TextView,Button等控件使用矢量图报错

1 问题描述 最近项目开发中,图标资源我尽量使用了矢量图,然而配置了基本的兼容设置,程序在低版本中运行还是出现了问题。 xml布局文件中,在TextView中使用矢量图,比如android:drawableS...

newtrek
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部