如何在 flutter 中使用精度对整数进行舍入
How to round integer number using precision in flutter
我正在尝试使线图的 Y 轴间隔在 flutter 中动态变化。这里的MaxVal会得到Y轴的最大值。
int interval = (maxVal/6).toInt();
int length = interval.toString().length.toInt();
所以在这里我将 maxVal 除以 6 这样我就可以得到间隔并找出长度。接下来我需要根据长度对间隔进行舍入。但是我看不到任何可以为 flutter 添加精度的选项。
The Expected Output
如果 maxVal = 10000 那么
间隔将 1666
那么长度将为4。然后
我预计舍入值为 2000
我假设您要求将 (non-negative) 整数四舍五入到其最重要的基数 10 位。舍入 non-negative 整数的一般方法是将要舍入的单位的一半相加,然后截断。例如,如果要将 non-negative 整数四舍五入到最接近的 1000,可以加上 1000/2 = 500,然后舍弃百位、十位和个位。丢弃这些数字的一种简单方法是执行整数除以 1000,然后再次乘以 1000。
最棘手的部分是确定要四舍五入的单位,因为它是可变的。如果您想要最重要的 10 位数字,则需要确定位数。从理论上讲,您可以使用对数来计算它,但是依赖于 floating-point 算术的精确结果通常是有风险的,您必须将 0 作为一种特殊情况来处理,并且更难确信正确性。仅查找数字字符串表示的长度更简单,更少 error-prone 。一旦我们找到位数,我们就可以确定要舍入哪个单位来计算相应的 10 次方。
import 'dart:math';
/// Rounds [n] to the nearest multiple of [multiple].
int roundToMultiple(int n, int multiple) {
assert(n >= 0);
assert(multiple > 0);
return (n + (multiple ~/ 2)) ~/ multiple * multiple;
}
/// Rounds [n] to its most significant digit.
int roundToMostSignificantDigit(int n) {
assert(n >= 0);
var numDigits = n.toString().length;
var magnitude = pow(10, numDigits - 1) as int;
return roundToMultiple(n, magnitude);
}
void main() {
var inputs = [
0,
1,
5,
9,
10,
11,
16,
19,
20,
21,
49,
50,
51,
99,
100,
469,
833,
1666,
];
for (var n in inputs) {
var rounded = roundToMostSignificantDigit(n);
print('$n => $rounded');
}
}
打印:
0 => 0
1 => 1
5 => 5
9 => 9
10 => 10
11 => 10
16 => 20
19 => 20
20 => 20
21 => 20
49 => 50
50 => 50
51 => 50
99 => 100
100 => 100
469 => 500
833 => 800
1666 => 2000
(如果需要,上面的代码也应该可以调整以处理负数,但首先您需要定义负数是应该向 0 舍入还是向负无穷大舍入。)
我正在尝试使线图的 Y 轴间隔在 flutter 中动态变化。这里的MaxVal会得到Y轴的最大值。
int interval = (maxVal/6).toInt();
int length = interval.toString().length.toInt();
所以在这里我将 maxVal 除以 6 这样我就可以得到间隔并找出长度。接下来我需要根据长度对间隔进行舍入。但是我看不到任何可以为 flutter 添加精度的选项。
The Expected Output
如果 maxVal = 10000 那么 间隔将 1666 那么长度将为4。然后 我预计舍入值为 2000
我假设您要求将 (non-negative) 整数四舍五入到其最重要的基数 10 位。舍入 non-negative 整数的一般方法是将要舍入的单位的一半相加,然后截断。例如,如果要将 non-negative 整数四舍五入到最接近的 1000,可以加上 1000/2 = 500,然后舍弃百位、十位和个位。丢弃这些数字的一种简单方法是执行整数除以 1000,然后再次乘以 1000。
最棘手的部分是确定要四舍五入的单位,因为它是可变的。如果您想要最重要的 10 位数字,则需要确定位数。从理论上讲,您可以使用对数来计算它,但是依赖于 floating-point 算术的精确结果通常是有风险的,您必须将 0 作为一种特殊情况来处理,并且更难确信正确性。仅查找数字字符串表示的长度更简单,更少 error-prone 。一旦我们找到位数,我们就可以确定要舍入哪个单位来计算相应的 10 次方。
import 'dart:math';
/// Rounds [n] to the nearest multiple of [multiple].
int roundToMultiple(int n, int multiple) {
assert(n >= 0);
assert(multiple > 0);
return (n + (multiple ~/ 2)) ~/ multiple * multiple;
}
/// Rounds [n] to its most significant digit.
int roundToMostSignificantDigit(int n) {
assert(n >= 0);
var numDigits = n.toString().length;
var magnitude = pow(10, numDigits - 1) as int;
return roundToMultiple(n, magnitude);
}
void main() {
var inputs = [
0,
1,
5,
9,
10,
11,
16,
19,
20,
21,
49,
50,
51,
99,
100,
469,
833,
1666,
];
for (var n in inputs) {
var rounded = roundToMostSignificantDigit(n);
print('$n => $rounded');
}
}
打印:
0 => 0
1 => 1
5 => 5
9 => 9
10 => 10
11 => 10
16 => 20
19 => 20
20 => 20
21 => 20
49 => 50
50 => 50
51 => 50
99 => 100
100 => 100
469 => 500
833 => 800
1666 => 2000
(如果需要,上面的代码也应该可以调整以处理负数,但首先您需要定义负数是应该向 0 舍入还是向负无穷大舍入。)