dart中如何進行浮點數的精確計算?

最近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-precisionapi進行抽象封裝開發了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,若有錯誤,願不吝賜教。學習

相關文章
相關標籤/搜索