给定一个double,我希望将它四舍五入到小数点后的给定精度点数,类似于PHP的round()函数。
我能在Dart文档中找到的最接近的东西是double.toStringAsPrecision(),但这不是我所需要的,因为它包括了精度总分中小数点前的数字。
例如,使用toStringAsPrecision(3):
0.123456789 rounds to 0.123
9.123456789 rounds to 9.12
98.123456789 rounds to 98.1
987.123456789 rounds to 987
9876.123456789 rounds to 9.88e+3
随着数字大小的增加,小数点后的精度也相应降低。
我认为公认的答案不是完美的解决方案,因为它转换为字符串。
如果你不想转换为字符串并返回双重使用
GetX包中的double.toPrecision(decimalNumber)。
如果你不想为此使用GetX(我强烈推荐GetX,它会改变你的生活),你可以复制和粘贴这个。
当你想使用扩展名时,请记住导入文件。
import 'dart:math';
extension Precision on double {
double toPrecision(int fractionDigits) {
var mod = pow(10, fractionDigits.toDouble()).toDouble();
return ((this * mod).round().toDouble() / mod);
}
}
你可以创建一个可重用的函数,接受你想格式化的numberOfDecimal,并利用toStringAsFixed()方法来格式化数字并将其转换回double。
供参考,toStringAsFixed方法不会四舍五入以5结尾的数字(例如:toStringAsFixed四舍五入2.275到2.27而不是2.28)。这是dart toStringAsFixed方法的默认行为(类似于Javascript的toFixed)
作为一种变通方法,我们可以在现有数字的最后一个十进制数后面加上1(例如:将0.0001加到2.275变成2.2751,而2.2751将正确舍入为2.28)
double roundOffToXDecimal(double number, {int numberOfDecimal = 2}) {
// To prevent number that ends with 5 not round up correctly in Dart (eg: 2.275 round off to 2.27 instead of 2.28)
String numbersAfterDecimal = number.toString().split('.')[1];
if (numbersAfterDecimal != '0') {
int existingNumberOfDecimal = numbersAfterDecimal.length;
number += 1 / (10 * pow(10, existingNumberOfDecimal));
}
return double.parse(number.toStringAsFixed(numberOfDecimal));
}
// Example of usage:
var price = roundOffToXDecimal(2.275, numberOfDecimal: 2)
print(price); // 2.28