前端计算数字精度丢失问题解决方法记录

这篇具有很好参考价值的文章主要介绍了前端计算数字精度丢失问题解决方法记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在日常一些需求中,总会遇到一些需要前端进行手动计算的场景,那么这里需要优先考虑的则是数字精度问题!具体请看下面截图

如图所示,在JavaScript进行浮点型数据计算当中,会出现计算结果“不正确”的现象。

我们知道浮点型数据类型主要有:单精度float、双精度double。

浮点型简单来说就是表示带有小数的数据,而恰恰小数点可以在相应的二进制的不同位置浮动,可能是因为这样就被定义成浮点型了。(不得不佩服这文化程度,定义个数据名称都这么有深度~)

但是!!!

JavaScript 存储小数和其它语言如 Java 和 Python 都不同,JavaScript 中所有数字包括整数和小数都只有一种类型 即 Number类型 它的实现遵循 IEEE 754 标准,IEEE 754 标准的内容都有什么,这个咱不用管,我们只需要记住以下一点:

javascript以64位双精度浮点数存储所有Number类型值,即计算机最多存储64位二进制数。

对于double型数据(双精度浮点数),其长度是8个字节(大小),右边52位用来表示小数点后面的数字,中间11位表示e(exponent)小数点移动的位数,左边一位用来表示正负。如图所示:

只要知道了这一点,那我们就可以对症下药(解决问题):

解决方案 ①

Number(parseFloat(20.24*100).toPrecision(16))


存储二进制时小数点的偏移量最大为52位,最多可表示的十进制为9007199254740992,对应科学计数尾数是 9.007199254740992,这也是 JavaScript 最多能表示的精度。它的长度是 16,所以可以使用 toPrecision(16) 来做精度运算。

通过先转为浮点型计算,然后做精度运算后再转为Number类型即可。

解决方案 ②

通过引入number-precision进行计算,步骤如下:

  • Install
npm install number-precision --save


  • Methods
NP.strip(num)         // strip a number to nearest right number
NP.plus(num1, num2, num3, ...)   // addition, num + num2 + num3, two numbers is required at least.
NP.minus(num1, num2, num3, ...)  // subtraction, num1 - num2 - num3
NP.times(num1, num2, num3, ...)  // multiplication, num1 * num2 * num3
NP.divide(num1, num2, num3, ...) // division, num1 / num2 / num3
NP.round(num, ratio)  // round a number based on ratio


  • Usage
import NP from 'number-precision'
NP.strip(0.09999999999999998); // = 0.1
NP.plus(0.1, 0.2);             // = 0.3, not 0.30000000000000004
NP.minus(1.0, 0.9);            // = 0.1, not 0.09999999999999998
NP.times(3, 0.3);              // = 0.9, not 0.8999999999999999
NP.divide(1.21, 1.1);          // = 1.1, not 1.0999999999999999
NP.round(0.105, 2);            // = 0.11, not 0.1


更多解决方案敬请关注后续更新,希望对您有帮助~

作者:京东零售 黄宏峰

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-746052.html

到了这里,关于前端计算数字精度丢失问题解决方法记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot返回前端Long类型字段丢失精度问题及解决方案

    Java服务端返回Long整型数据给前端,JS会自动转换为Number类型。而Long类型能表示的最大值为(),当数值超过JS中Number类型的最大值()时,就会丢失精度。 首先,引入依赖。 新建一个自定义大数据序列化类,如下: 新建Jackson配置类 本文针对Java服务端返回Long整型数据给前端时

    2024年03月22日
    浏览(105)
  • Java中整数相除并保留两位小数的实现方式、保留两位小数:Java中整数相除的处理方法、解决Java整数相除后精度丢失的问题、Java数值计算:整数相除保留指定小数位数的技巧

    当在Java中需要进行整数相除并保留两位小数时,可以使用以下两种方式实现: 1. 使用浮点数类型和DecimalFormat进行格式化:  2. 使用BigDecimal类进行精确的数值计算和格式化输出: 在选择使用哪种方式时,需要根据具体的业务需求和数值计算的精度要求进行权衡和选择。如果

    2024年02月12日
    浏览(42)
  • 后端Long类型传到前端精度丢失的问题

    问题出现:后端的Java Bean的id属性是用的Long类型对应数据库主键使用bigint类型,当使用JSON方式传递该数据给前端时,前端接收到的数据末尾会变成0。(发生的精度丢失问题) 问题原因:Java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值

    2024年02月16日
    浏览(60)
  • 后端传long类型数据到前端精度丢失问题

    在 Spring Boot 中,将 long 类型传输到前端时,会发现该类型的值可能会出现精度丢失的问题。 这是因为在 JavaScript 中,数字类型默认会被转换为双精度浮点数,而双精度浮点数的精度有限,只能精确表示 2 的 53 次方以内(即 Number.MAX_SAFE_INTEGER,约为 9 x 10^15)的整数。对于超过

    2024年02月15日
    浏览(48)
  • 前端接收后端数据时,遇到精度丢失的问题

    之前项目开发过程中遇到过前端接收后端数据时,遇到精度丢失的问题。当时进行了问题记录,本篇博客针对于这个问题进行问题原因并进行多种方式解决这个问题。 前端接收后端返回的数据时出现精度丢失问题,通常是因为在数据传输过程中,数据类型被转换为了 JavaScr

    2024年02月02日
    浏览(70)
  • js浮点数四则运算精度丢失以及toFixed()精度丢失解决方法

    1、四则运算精度丢失: 2、toFixed() 四舍五入精度丢失: js采用64位浮点数表示法(几乎所有现代编程语言所采用),这是一种二进制表示法。二进制浮点数表示法并不能精确表示类似 0.1 这样简单的数字。 这个问题不只在js中才会出现,在任何使用二进制浮点数的编程语言中

    2024年02月05日
    浏览(47)
  • python的csv库:保存数字仅有15位,精度丢失的解决办法

    废话不多说,         如果在字符串后添加制表符 ‘/t’ 能够解决问题,那么这确实是一个有效的解决方案。制表符 ‘/t’ 在CSV文件中可以被视为分隔符,确保数据不会被自动格式化或截断。 生成的表格: 设置单元格分类位‘数值’表示: 可以看到20位数字+‘/t’被不

    2024年02月11日
    浏览(31)
  • 完美解决!处理精度丢失问题点

    目录 1. 解决后端响应数据给前端出现精度丢失问题 2. Freemark BigDecimal数据显示精度丢失问题 3. 前端调用方法传值精度丢失问题 解决方式一: 在项目中都是将注解标注在对应字段上,在Json序列化的时候把Long自动转为String。  解决方式二: 全局配置 每个实体类的id字段都需要

    2024年02月15日
    浏览(70)
  • 前端处理后端传来的Long型数据精度丢失的问题--对象转换器Jackson0bjectMapper

    1、问题描述 前端提交参数 后端处理 前端js对long型数据进行处理时丢失精度(只能保证16位),导致提交的id和数据库中的id不一致。 2、 问题实现 如何解决这个问题? 我们可以在服务端给页面响应json数据时进行处理,将long型数据统一转为String字符串 3、具体代码实现–对象

    2024年02月16日
    浏览(88)
  • Es 通过javaApi上传数据Long类型丢失精度的问题一次性解决

    通过 updateRequest.docAsUpsert(true) true 表示无匹配_id是插入数据,false 表示无匹配_id会抛出异常

    2024年02月15日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包