显式转换
显示转换有什么好处呢?就是可以让你知道它的怎么来的(我就想知道它是怎么没的)。同时,还可以自由设置每个转换后的返回值。
AutoDecimal:轻松解决 JavaScript 运算精度问题
AutoDecimal:轻松解决 JavaScript 运算精度问题之跳过转换
AutoDecimal:轻松解决 JavaScript 运算精度问题之显式转换
AutoDecimal:轻松解决 JavaScript 运算精度问题之toDecimal
AutoDecimal:轻松解决 JavaScript 运算精度问题之new Function
已经发布的两篇文章讲述了如何"隐式转换",来解决计算精度的问题。同时为了解决一些历史遗留问题,让项目能顺利的跑起来,而添加了一些属性来打补丁。补丁之后,就会觉得这是什么东西啊?这么丑陋不堪。
其实很多时候我们可以用显式的方式来解决它,那样不需要额外的补丁,也不需要害怕会因为某些原因而造成项目的无法启动。
于是,在多方面思考以及实践下,AutoDecimal 又添加新属性了(⁎⁍̴̛ᴗ⁍̴̛⁎)。
toDecimal
toDecimal 接收3个属性,用来决定转换的返回值。当然,也可以在使用插件的地方设置全局参数。
callMethod转换后调用decimal的方法,目前仅支持toNumber,toString,toFixedprecision小数精度,当callMethod为toFixed时,可以指定保留的小数位数roundingModes舍入模式,decimal的roundingModes, 不了解的可以 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 的计算表达式,将不会转换。将主动权完全交到了你的手里,刺激不...