AutoDecimal:轻松解决 JavaScript 运算精度问题之显式转换

236 阅读2分钟

显式转换

文档传送门

显示转换有什么好处呢?就是可以让你知道它的怎么来的(我就想知道它是怎么没的)。同时,还可以自由设置每个转换后的返回值。

AutoDecimal:轻松解决 JavaScript 运算精度问题

AutoDecimal:轻松解决 JavaScript 运算精度问题之跳过转换

AutoDecimal:轻松解决 JavaScript 运算精度问题之显式转换

AutoDecimal:轻松解决 JavaScript 运算精度问题之toDecimal

AutoDecimal:轻松解决 JavaScript 运算精度问题之new Function

已经发布的两篇文章讲述了如何"隐式转换",来解决计算精度的问题。同时为了解决一些历史遗留问题,让项目能顺利的跑起来,而添加了一些属性来打补丁。补丁之后,就会觉得这是什么东西啊?这么丑陋不堪。

其实很多时候我们可以用显式的方式来解决它,那样不需要额外的补丁,也不需要害怕会因为某些原因而造成项目的无法启动。

于是,在多方面思考以及实践下,AutoDecimal 又添加新属性了(⁎⁍̴̛ᴗ⁍̴̛⁎)。

toDecimal

toDecimal 接收3个属性,用来决定转换的返回值。当然,也可以在使用插件的地方设置全局参数。

  • callMethod 转换后调用 decimal 的方法,目前仅支持 toNumber, toString, toFixed
  • precision 小数精度,当 callMethodtoFixed 时,可以指定保留的小数位数
  • roundingModes 舍入模式, decimalroundingModes, 不了解的可以 decimal.js 去看一下。
  • name 为了解决命名冲突添加,如果你项目中已经有了一个名为 toDecimal 的全局方法,那么你可以通过 name 指定函数的名称。

示例:

// vite.config.ts
import { defineConfig } from 'vite';
import AutoDecimal from 'unplugin-auto-decimal/vite';

export default defineConfig({
  plugins: [
    AutoDecimal({
      // toDecimal: true
      toDecimal: {
        callMethod: 'toNumber',
        precision: 2,
        roundingModes: 'ROUND_HALF_UP',
        name: 'toDecimal'
      }
    })
  ]
});

// 如果指定了 name 的话,那么调用的时候,需要调用你所填写的名称哟
// 如果 name: 'heiyohei'
const a = 0.1 + 0.2.heiyohei()
console.log(a, 0.3)

const a = 0.1 + 0.2.toDecimal()
// 或者
const b = (0.1 + 0.2).toDecimal()
console.log(a, 0.3)
console.log(b, 0.3)

const c = (0.111 + 0.222).toDecimal({callMethod: 'toFixed', precision: 2, roundingModes: 'ROUND_UP'})
console.log(c, 0.34)

这般如此即可。

提示

当启用了 toDecimal 后, supportString, tailPatchZero 将失效,就是说即使你设置了它俩,也不起作用了。因为直接忽略了... 没有调用 toDecimal 的计算表达式,将不会转换。将主动权完全交到了你的手里,刺激不...