Răsfoiți Sursa

Floating inputs for `round()` should return a Floating output when ndigit is 0 (#217)

* Fix round for floating inputs

* Refactor integer inputs

* some fix

---------

Co-authored-by: blueloveTH <blueloveth@foxmail.com>
Anurag Bhat 2 ani în urmă
părinte
comite
5100f4e454
2 a modificat fișierele cu 14 adăugiri și 9 ștergeri
  1. 6 9
      src/pocketpy.cpp
  2. 8 0
      tests/70_builtins.py

+ 6 - 9
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) {

+ 8 - 0
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]