【问题标题】:Flutter float number rounding颤振浮点数舍入
【发布时间】:2020-01-07 03:14:38
【问题描述】:

我想在我的代码中实现以下目标,但似乎找不到合适的解决方案: 我需要始终显示 6 位数字的代码,无论是大于 999999 的 int 还是小于 0 的浮点数。

100000 -> 100000
1000000 -> 100000

10000.0 -> 10000
100.01111 -> 100.011

0.000001 -> 0
0.000011 -> 0.00001

在 cmets 的一些帮助下,我得到了一个适合我的解决方案。如果有人有更优雅的方法,请分享。

int desiredPrecision = 6;
int numberOfDigitsOnTheLeft = val.toInt().toString().length;
String sixDigitString = val.toStringAsFixed(desiredPrecision-numberOfDigitsOnTheLeft);

【问题讨论】:

  • numtoString*方法
  • @pskink num.toString 方法没有为我的具体问题提供适当的解决方案。它们给出精确的小数位数或适当的有效小数位数。
  • @Eugene "duplicate" 的所有答案都显示了如何设置特定的小数位数,但没有解决如何设置特定位数的解决方案。不同类型的问题
  • 找出点左侧有多少个数字(称为left),右侧需要5 - left - 例如,如果左侧有2个数字那么你需要右边的3个数字
  • 编辑:在你的情况下是6,而不是5

标签: flutter number-formatting


【解决方案1】:

作为一种选择

void main() {
    print(_normalizeNum(10000.0));
    print(_normalizeNum(100000));
    print(_normalizeNum(1000000));
    print(_normalizeNum(10000.0));
    print(_normalizeNum(100.01111));
    print(_normalizeNum(0.000001));
    print(_normalizeNum(0.000011));
}

String _normalizeNum(num d) {
  d = d.clamp(double.negativeInfinity, 999999);
  d = num.parse(d.toStringAsFixed(6).substring(0, 7));
  if (d == d.toInt()) {
    d = d.toInt();
  }
  return d.toString();
}

【讨论】:

  • 出于好奇,为什么钳制不是在 999999 上进行,而是在 100000 上进行
  • 但是等等,你写了1000000 -> 100000所以它应该钳制到100000
  • 是的,但在 999999 的情况下,它不应该钳制到 100000。它应该保持该数字的 6 位表示。在这种情况下,如果数字更大,应该可以将其保持在溢出的最大限制。我会保持 999999 作为上限:)
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多