最近flutter很火,火的几乎周边的小伙伴都开始学习这个跨平台新框架,做为一名优秀的前端折腾师,那确定的赶忙学起来了,可是在浮点数计算的时候,却遇到了与前端一样的问题,精度舍入问题。前端
举个栗子:git
0.1 + 0.2 = 0.30000000000000004 1.0 - 0.9 = 0.09999999999999998 0.105.toStringAsFixed(2) = 0.1 // not 0.11
具体的缘由这里再也不叙述,读者可自行Google。github
那在前端领域通常咱们都是使用第三方库进行浮点数的计算,这里笔者常常使用的库则是number-precision,这个库的核心思想是使用放大缩小法进行精度的准确计算,譬如 0.1 + 0.2
咱们能够转换为1 + 2
等于3
,而后咱们将其再缩小10
倍就能够获得0.3
,由于整数的计算是没有精度问题的,因此恰好能够巧妙的解决这个问题。api
在dart
中咱们能够一样使用这个放大缩小法进行浮点数的准确计算,在这里为了方便前端开发人员无缝切入,笔者基于number-precision的api
进行抽象封装开发了number_precisiondart
版本,现已正式发布1.0.0版本,欢迎广大读者进行安装使用,语法糖保持和number-precision如出一辙,轻量简洁且不依赖第三方库。框架
找到项目的 pubspec.yaml
文件,添加如下代码:ide
dependencies: number_precision: ^1.0.0+1
NP.strip(num) // 将浮点数矫正为正确的小数 NP.plus(num1, num2, [num3, ...]) // 加法, num + num2 + num3, 第一二参数为必选项 NP.minus(num1, num2, [num3, ...]) // 减法, num1 - num2 - num3 NP.times(num1, num2, [num3, ...]) // 乘法, num1 * num2 * num3 NP.divide(num1, num2, [num3, ...]) // 除法, num1 / num2 / num3 NP.round(num, ratio) // 保留ratio位小数
import 'package:number_precision/number_precision.dart'; NP.strip(0.09999999999999998); // = 0.1 NP.plus(0.1, 0.2); // = 0.3, not 0.30000000000000004 NP.plus(2.3, 2.4); // = 4.7, not 4.699999999999999 NP.minus(1.0, 0.9); // = 0.1, not 0.09999999999999998 NP.times(3, 0.3); // = 0.9, not 0.8999999999999999 NP.times(0.362, 100); // = 36.2, not 36.199999999999996 NP.divide(1.21, 1.1); // = 1.1, not 1.0999999999999999 NP.round(0.105, 2); // = 0.11, not 0.1
开源不易,欢迎pr以及star,项目地址number_precision,若有错误,愿不吝赐教。学习