dart - 银行家在 Dart 中的四舍五入
问题描述
任何人都可以帮助银行家在 Dart 中的舍入实现吗?
所以我将 3 dp 舍入到最接近的 2 dp 数字,除非数字在它之间的中间,它会接近最近的偶数
例如
print(1.011.toStringAsFixed(2)); // rounds down to 1.01
print(1.019.toStringAsFixed(2)); // rounds up to 1.02
print(1.015.toStringAsFixed(2)); // rounds down to 1.01 but i want up to 1.02
print(1.025.toStringAsFixed(2)); // rounds down to 1.02
解决方案
我有同样的要求,所以我建立了一个。
banker_rounding.dart
import 'dart:math';
import 'package:decimal/decimal.dart';
Decimal _getDecimalOfNumber(Decimal number, int fractionDigits) => number - (number.floor());
Decimal _pow10(int powNum) => Decimal.parse(pow(10, powNum).toString());
Decimal _carryLatest(Decimal number) {
int decimalLength = number.toString().length - 2;
Decimal offset = _pow10(-decimalLength);
return number + offset;
}
Decimal bankerRound(Decimal value, int fractionDigits) {
// integer of number
Decimal integerOfNumber = value.floor();
// decimal of number
Decimal decimalOfNumber = _getDecimalOfNumber(value, fractionDigits);
// remain flag
int remainFlag = (decimalOfNumber * _pow10(fractionDigits + 1) % Decimal.fromInt(10)).toInt();
Decimal finalMultiple = _pow10(fractionDigits);
Decimal finalDecimalOfNumber = ((decimalOfNumber * finalMultiple).floor() / finalMultiple);
if (remainFlag <= 4) {
// do nothing
} else if (remainFlag >= 6) {
// carry
finalDecimalOfNumber = _carryLatest(finalDecimalOfNumber);
} else {
// check bottom has number
bool hasBottom = _getDecimalOfNumber(decimalOfNumber * _pow10(fractionDigits + 1), fractionDigits) != Decimal.zero;
if (hasBottom) {
// carry
finalDecimalOfNumber = _carryLatest(finalDecimalOfNumber);
} else {
// check pre remain flag
int preLastNumber = (decimalOfNumber * _pow10(fractionDigits) % Decimal.fromInt(10)).toInt();
if (preLastNumber.isOdd) {
// carry
finalDecimalOfNumber = _carryLatest(finalDecimalOfNumber);
} else {
// do nothing
}
}
}
return integerOfNumber + finalDecimalOfNumber;
}
推荐阅读
- exchangewebservices - 移动项目时不会更改的唯一项目 ID
- javascript - 在 webpack 中动态添加全局常量
- php - 提取两个字符之间的文本
- csv - phpmyadmin 一次只导入 48 条记录
- python-3.x - 凯撒密码,小写不工作
- regex - 在 perl 中使用正则表达式从文本块中提取子字符串或行
- ruby-on-rails - Postgres gem没有安装
- mysql - 从 Google Apps 脚本连接到本地 MySQL 数据库
- java - 有没有办法让另一个类可以访问一个类的私有方法而不嵌套它?
- rust - 独立于方法返回 RWLockReadGuard