如何完美解决前端数字计算精度丢失与数字格式化问题?

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

大家好,我是木瓜太香,做前端开发经常会遇到数字计算精度丢失的问题,和数字格式化的麻烦问题,好不容易找到了可以解决这些问题的库结果用起来不够方便,例如 bignumber.js decimal.js 等编写体验不好,这篇文章来帮助你完美解决这些问题

接下来我们根据以下两个问题展开说说:

  • 只有前端会数字运算不准确吗?后端为什么不会这样?
  • 怎样完美解决数字计算精度问题和数字格式化问题?

只有前端会数字运算不准确吗?后端为什么不会这样?

实际上并非只有前端的 javascript 有数字计算的精度问题,其他的常见语言默认都有这个问题,大家可以自己去试一试,只不过其他的语言都自带了精准计算的库,所以后端在处理数字的时候会使用语言自带的模块来保证数字计算的精准,而javascript目前还没有自带相关模块,只有第三方的模块,不过未来的javascript是可能自带精准计算模块的,这里有一个相关提案,目前处于 Stage 1 阶段,目前提案的语法如下:

function calculateBill(items, tax) 
{
    let total = 0m;
    for (let {price, count} of items)
    {
        total += price * BigDecimal(count);
    }
    return BigDecimal.round( total * (1m + tax), {maximumFractionDigits: 2, round: "up"} );
}

let items = [{price: 1.25m, count: 5}, {price: 5m, count: 1}];
let tax = .0735m;
console.log(calculateBill(items, tax));

当然上面的代码现在是无法使用的,只是提案的一个语法展示例子,而且即便支持了这个语法,从易用性上来说也不如我们接下来介绍的方法。

怎样完美解决数字计算精度问题和数字格式化问题?

答案就是 a-calc 库,这个库具备精准计算需求也兼顾了数字格式化和易用性的需求,我们都知道 bignumber.js 这类库最大的问题就是操作数一旦多起来那么就非常不直观,我们来看看 a-calc 是怎么使用的。

基础的运算:

import { calc } from "a-calc"

calc("0.1 + 0.2") // 0.3

变量运算:

calc(" (a + b) / 2 ", {a: 2, b: 6}) // 4

你没看错就是这么简单,编写方式非常符合直觉,接下来我们再来看看一个复杂一点的计算式。

calc("1 + o.a / arr[0].d",{
    o: { a: 2 },
    arr: [{ d: 8 }]
}) // 1.25

到这里你可能有一个疑问,如果变量没取到,或者因为某些原因导致计算式非法怎么办?默认当然是报错了,不过贴心的 a-calc 自然也给了你更方便的功能,错误返回默认值。

calc(" a + 1 ", {a: undefined, _error: 0}) // 0

上面的 a是undefined那么计算式就不会成立,无法计算,但是一旦你传入了 _error 参数,在即将报错的时候他会返回给你 0,这样你就不用自己做错误处理了,慢着,这就完了吗?当然不是,都说了要完美了,这些功能自然还不够!接下来我们说说数字格式化。

我们实际开发中可能在计算完成之后做常规的数字格式化或者就单纯需要数字格式化,例如千分位,保留小数位,转换成百分比,禁止输出科学计数法,转换成分数,等等,放心,这些全部支持,而且更强大 a-calc 除了支持上面的格式化还支持动态保留小数位,保留正负号,带单位计算等等,下面直接上代码。

// 注意格式化部分使用 | 与表达式部分分隔开,写在右边即可
calc("1 + 1 | =2") // 2.00  =2的意思就是小数点位数保留2位,既然有等于那么你也应该想到了,大于 小于 大于等于和小于等于也是支持的
calc("132424232423423 + 2132243242 | ,") // 132,426,364,666,665 这里一个逗号就表示千分位了
calc("0.025 + 0.2 | /") // 9/40 分数输出也很直观!到这里百分比输出还用演示吗?想必大家应该已经知道了就是一个百分号就行了。
calc("1 + 2%", {_unit: true}) // 3% 带单位计算依然不在话下

良好的typescript支持

如果你使用了typescript,那么依然可以等到良好的ts类型提醒,正常情况下你可以使用 calc 一把梭哈,但是 a-calc 依然提供了一个更加强大智能的 calc_wrap 函数:

// 注意这里将 calc_wrap 重命名为 calc, 因为如果你需要使用 calc_wrap 函数的时候,基本用不到核心的 calc 函数,那么有这个闲置好名字就应该拿来用
import { calc_wrap as calc } from "a-calc";

const state = {
    a: 1,
    b: 2,
    c: 3
};

// 当传入的参数是一个不含变量名的计算式将会直接返回计算结果
calc( "(1 + 2) * 3" ); // 返回类型: string

// 当传入的参数是一个疑似包含变量名的计算式且没有第二个数据源参数时,会返回一个等待传入数据源的函数,没错这个功能通过静态类型的推导做到了
calc( "(a + b) * c" ); // 返回类型: ( data: any ) => string
calc( "(a + b) * c" )( state ); // 返回类型: string

// 也许你希望先注入状态然后在输入表达式,这也是可以的
calc( state ); // 返回类型: ( expr: string | number ) => string
calc( state )( "(a + b) * c" ); // 返回类型: string

// 原本的用法自然也是支持的
calc( "a + b + c", state ); // 返回类型: string

// 你依然可以将配置与数据源混合在一起,这是非常方便的
calc( "a + b + c" )( { ...state, _error: 0 } ); // 返回类型: string | 0

好了到这里你应该也了解了 a-calc 大部分的使用方式,更具体的内容可以查看官方文档:https://www.npmjs.com/package/a-calc
如果你觉得我的内容对你有帮助可以点赞加关注,永远不迷路。
你也可以关注我的油管和b站账号:木瓜太香

有前端问题需要讨论的可以加我的qun:237871108。也可以通过哔哩哔哩搜索木瓜太香找到我。文章来源地址https://www.toymoban.com/news/detail-559370.html

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

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

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

相关文章

  • 记录--前端金额运算精度丢失问题及解决方案

    前端开发中难免会遇到价格和金额计算的需求,这类需求所要计算的数值大多数情况下是要求精确到小数点后的多少位。但是因为JS语言本身的缺陷,在处理浮点数的运算时会出现一些奇怪的问题,导致计算不精确。 本文尝试从现象入手,分析造成这一问题原因,并总结和整

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

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

    2024年02月11日
    浏览(24)
  • SpringBoot返回前端Long类型字段丢失精度问题及解决方案

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

    2024年03月22日
    浏览(46)
  • Vue 数字相加、相减精度丢失处理。

    方法 一: 方法 二: 方法 三:扩大运算范围:将浮点数转化为整数,相乘或相加后再除回去,可以避免小数位精度的影响。 最后就是使用第三方库:例如 decimal.js、big.js 等第三方库可以提供更高精度的浮点数运算。

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

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

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

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

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

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

    2024年02月02日
    浏览(34)
  • spring Boot处理返回给前端Long类型精度丢失

    项目中采用springcloud Alibaba技术开发分布式系统,开发过程中采用雪花算法生成分布式Id,为Long类型,而Long类型返回给前端,会出现精度丢失问题。 接下来我们主要了解下,如何快速的处理精度丢失的问题 可以直接在返回实体属性添加\\\"@JsonSerialize(using = ToStringSerializer.class)\\\"。

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

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

    2024年02月05日
    浏览(38)
  • 【钱处理】商业计算怎样才能保证精度不丢失

    以项目驱动学习,以实践检验真知 很多系统都有「处理金额」的需求,比如电商系统、财务系统、收银系统,等等。只要和钱扯上关系,就不得不打起十二万分精神来对待,一分一毫都不能出错,否则对系统和用户来说都是灾难。 保证金额的准确性主要有两个方面: 溢出

    2024年02月12日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包