首页 > 解决方案 > 银行家在 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

标签: dartdoubleprecision

解决方案


我有同样的要求,所以我建立了一个。

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;
}

推荐阅读