diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index cd3804cf..63f2a15b 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -136,17 +136,14 @@ void init_builtins(VM* _vm) { }); _vm->bind(_vm->builtins, "round(x, ndigits=None)", [](VM* vm, ArgsView args) { + if(is_int(args[0])) return args[0]; f64 x = CAST(f64, args[0]); - if(is_int(args[0])) return VAR(i64(x)); - if(args[1] == vm->None) return x >= 0 ? VAR((i64)(x + 0.5)) : VAR((i64)(x - 0.5)); + f64 offset = x >= 0 ? 0.5 : -0.5; + if(args[1] == vm->None) return VAR((i64)(x + offset)); int ndigits = CAST(int, args[1]); - if(ndigits == 0) return x >= 0 ? VAR(f64((i64)(x + 0.5))) : VAR(f64((i64)(x - 0.5))); if(ndigits < 0) vm->ValueError("ndigits should be non-negative"); - if(x >= 0){ - return VAR((i64)(x * std::pow(10, ndigits) + 0.5) / std::pow(10, ndigits)); - }else{ - return VAR((i64)(x * std::pow(10, ndigits) - 0.5) / std::pow(10, ndigits)); - } + // ndigits > 0 + return VAR((i64)(x * std::pow(10, ndigits) + offset) / std::pow(10, ndigits)); }); _vm->bind_func<1>(_vm->builtins, "abs", [](VM* vm, ArgsView args) { diff --git a/tests/70_builtins.py b/tests/70_builtins.py index 212061e5..15d3a7ba 100644 --- a/tests/70_builtins.py +++ b/tests/70_builtins.py @@ -1,6 +1,7 @@ assert round(23.2) == 23 assert round(23.8) == 24 assert round(-23.2) == -23 +assert round(-23.2, 0) == -23.0 assert round(-23.8) == -24 assert round(23.2, 0) == 23.0 assert round(23.8, 0) == 24.0 @@ -21,6 +22,9 @@ assert round(-3.14159, 3) == -3.142 assert round(-3.14159, 2) == -3.14 assert round(-3.14159, 1) == -3.1 assert round(-3.14159, 0) == -3 +assert round(11, 0) == 11 +assert round(11, 1) == 11 +assert round(11, 234567890) == 11 a = [1,2,3,-1] assert sorted(a) == [-1,1,2,3]