diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 6dbfa6bc..63f2a15b 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -135,18 +135,15 @@ void init_builtins(VM* _vm) { return VAR(MappingProxy(mod)); }); - _vm->bind(_vm->builtins, "round(x, ndigits=0)", [](VM* vm, ArgsView args) { + _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]); + 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((i64)(x + 0.5)) : VAR((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 ed703c5f..15d3a7ba 100644 --- a/tests/70_builtins.py +++ b/tests/70_builtins.py @@ -1,7 +1,12 @@ 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 +assert round(-23.2, 0) == -23.0 +assert round(-23.8, 0) == -24.0 # round with precision assert round(23.2, 1) == 23.2 assert round(23.8, 1) == 23.8 @@ -17,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]