Stop nu panicks in math.round on a large decimal value(Most of the time) (#3224)

* Stop crashing when dealing with large numbers in math round

* Fix formatting

* add tests

* just to trigger wasm build

* trigger wasm build
This commit is contained in:
Luccas Mateus 2021-03-31 03:01:39 -03:00 committed by GitHub
parent c42b588782
commit 387098fc87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 2 deletions

View File

@ -76,9 +76,12 @@ fn round_big_int(val: BigInt) -> Value {
fn round_big_decimal(val: BigDecimal, precision: i64) -> Value {
if precision > 0 {
UntaggedValue::decimal(val.round(precision)).into()
UntaggedValue::decimal(val.with_scale(precision + 1).round(precision)).into()
} else {
let (rounded, _) = val.round(precision).as_bigint_and_exponent();
let (rounded, _) = val
.with_scale(precision + 1)
.round(precision)
.as_bigint_and_exponent();
UntaggedValue::int(rounded).into()
}
}

View File

@ -1,6 +1,7 @@
mod avg;
mod eval;
mod median;
mod round;
mod sum;
use nu_test_support::{nu, pipeline};

View File

@ -0,0 +1,21 @@
use nu_test_support::nu;
#[test]
fn can_round_very_large_numbers() {
let actual = nu!(
cwd: ".",
"echo 18.1372544780074142289927665486772012345 | math round"
);
assert_eq!(actual.out, "18")
}
#[test]
fn can_round_very_large_numbers_with_precision() {
let actual = nu!(
cwd: ".",
"echo 18.13725447800741422899276654867720121457878988 | math round -p 10"
);
assert_eq!(actual.out, "18.137254478")
}