decimal パッケージは、Dart で正確な小数演算を提供し、浮動小数点演算で一般的に発生する精度の損失なしに小数を正確に扱うことを可能にします。正確な小数表現と算術をサポートしており、金融計算や高精度が必要なその他のシナリオに最適です。このパッケージは、モバイル、Web、デスクトップを含むすべての主要プラットフォームで互換性があります。丸めモードやスケールに対する完全な制御を備えた、小数値の作成、操作、フォーマット用のクリーンな API を提供しています。
This project enable to make computations on decimal numbers without losing precision like double operations.
For instance :
// with doubleprint(0.2 + 0.1); // displays 0.30000000000000004// with decimalprint(Decimal.parse('0.2') + Decimal.parse('0.1')); // displays 0.3
Usage
To use this library in your code :
add a dependency in your pubspec.yaml :
dependencies:decimal:
add import in your dart code :
import'package:decimal/decimal.dart';
Start computing using Decimal.parse('1.23').
Hint : To make your code shorter you can define a shortcut for Decimal.parse :
final d = (String s) => Decimal.parse(s);
d('0.2') + d('0.1'); // => 0.3
Formatting with intl
You can use the intl package to format decimal
with DecimalFormat from the package:decimal/intl.dart library:
import'package:decimal/decimal.dart';
import'package:decimal/intl.dart';
main() {
var value = Decimal.parse('1234.56');
var formatter = DecimalFormatter(NumberFormat.decimalPattern('en-US'));
print(formatter.format(value));
}
Tip: you can define an extension to make it more fluent:
extensiononDecimal {
StringformatWith(NumberFormat formatter) => formatter.format(DecimalIntl(this));
}
main() {
var value = Decimal.parse('1234.56');
var formatter = DecimalFormatter(NumberFormat.decimalPattern('en-US'));
print(value.formatWith(formatter));
}
WARNING: For now (2024.05.30) intl doesn't work with NumberFormat.maximumFractionDigits greater than 15 on web plateform and 18 otherwise.
Parsing with intl
You can use the NumberFormat from intl package to parse formatted decimals
var currencyFormatter = DecimalFormatter(NumberFormat.simpleCurrency(name: 'USD'));
currencyFormatter.parse('\$3.14'); // => 3.14