flutter - 如何在 flutter 中使用精度对整数进行舍入

标签 flutter dart rounding

我正在尝试使折线图的 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

最佳答案

我假设您要求将(非负)整数四舍五入到其最高有效基数 10 数字。对非负整数进行舍入的一般方法是添加要舍入的单位的一半,然后截断。例如,如果要将非负整数四舍五入到最接近的 1000,可以添加 1000/2 = 500,然后丢弃百位、十位和个位。丢弃这些数字的一个简单方法是执行整数除以 1000,然后再次乘以 1000。

最棘手的部分是确定要舍入到什么单位,因为它是可变的。如果您想要最高有效的 10 进制数字,则需要确定位数。理论上你可以用对数来计算,但依赖浮点运算的精确结果通常是有风险的,你必须将 0 作为特殊情况来处理,而且更难确定正确性。仅查找数字字符串表示形式的长度更简单且不易出错。一旦我们找到了位数,我们就可以确定要舍入哪个单位来计算相应的 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 舍入或向负无穷大舍入。)

关于flutter - 如何在 flutter 中使用精度对整数进行舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71776534/

相关文章:

dart - 如何在 Polymer.dart 中使用 Material 设计的内置 css 颜色类?

javascript - javascript 中的 Math.round MidPointRounding.AwayFromZero

java - 四舍五入并显示值

dart - 为什么 cupertino_icons 中的图标很少?

android - 有没有一种方法可以在 flutter 中实现一种像信标一样的蓝牙广播?

flutter - TextFormField 在改变焦点时失去值(value)

android - Android Studio 中缺少数据库检查器

dart - 如何在flutter https ://key:secret@payment. api/payments/transactionid/update中调用URL

dart - flutter (dart) 是否能够在单独的 isolate 中发出 api 请求?

vb.net - 舍入数字 : if number is closer to 100, 向下舍入到最接近的 250,否则向上舍入到最接近的 250