关于dart:dart中如何进行浮点数的精确计算

9次阅读

共计 1332 个字符,预计需要花费 4 分钟才能阅读完成。

最近 flutter 很火,火的简直周边的小伙伴都开始学习这个跨平台新框架,作为一名 优良的前端 折腾师,那必定的连忙学起来了,然而在浮点数计算的时候,却遇到了与前端同样的问题,精度舍入问题。

举个栗子:

0.1 + 0.2 = 0.30000000000000004

1.0 - 0.9 = 0.09999999999999998

0.105.toStringAsFixed(2) = 0.1 // not 0.11

具体的起因这里不再叙述,读者可自行 Google。

那在前端畛域个别咱们都是应用第三方库进行浮点数的计算,这里笔者常常应用的库则是 number-precision, 这个库的核心思想是应用放大放大法进行精度的精确计算,譬如 0.1 + 0.2咱们能够转换为 1 + 2 等于 3, 而后咱们将其再放大10 倍就能够失去0.3,因为整数的计算是没有精度问题的,所以刚好能够奇妙的解决这个问题。

dart 中咱们能够同样应用这个放大放大法进行浮点数的精确计算,在这里为了不便前端开发人员无缝切入,笔者基于 number-precision 的 api 进行形象封装开发了 number_precisiondart版本, 现已正式公布 1.0.0 版本,欢送广大读者进行装置应用,语法糖放弃和 number-precision 截然不同,轻量简洁且不依赖第三方库。

装置应用

找到我的项目的 pubspec.yaml 文件,增加以下代码:

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, 如有谬误,愿不吝赐教。

正文完
 0