@@ -445,7 +445,36 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_repr_obj, mp_builtin_repr);
445445STATIC mp_obj_t mp_builtin_round (size_t n_args , const mp_obj_t * args ) {
446446 mp_obj_t o_in = args [0 ];
447447 if (MP_OBJ_IS_INT (o_in )) {
448- return o_in ;
448+ if (n_args <= 1 ) {
449+ return o_in ;
450+ }
451+
452+ #if !MICROPY_PY_BUILTINS_ROUND_INT
453+ mp_raise_NotImplementedError (NULL );
454+ #else
455+ mp_int_t num_dig = mp_obj_get_int (args [1 ]);
456+ if (num_dig >= 0 ) {
457+ return o_in ;
458+ }
459+
460+ mp_obj_t mult = mp_binary_op (MP_BINARY_OP_POWER , MP_OBJ_NEW_SMALL_INT (10 ), MP_OBJ_NEW_SMALL_INT (- num_dig ));
461+ mp_obj_t half_mult = mp_binary_op (MP_BINARY_OP_FLOOR_DIVIDE , mult , MP_OBJ_NEW_SMALL_INT (2 ));
462+ mp_obj_t modulo = mp_binary_op (MP_BINARY_OP_MODULO , o_in , mult );
463+ mp_obj_t rounded = mp_binary_op (MP_BINARY_OP_SUBTRACT , o_in , modulo );
464+ if (mp_obj_is_true (mp_binary_op (MP_BINARY_OP_MORE , half_mult , modulo ))) {
465+ return rounded ;
466+ } else if (mp_obj_is_true (mp_binary_op (MP_BINARY_OP_MORE , modulo , half_mult ))) {
467+ return mp_binary_op (MP_BINARY_OP_ADD , rounded , mult );
468+ } else {
469+ // round to even number
470+ mp_obj_t floor = mp_binary_op (MP_BINARY_OP_FLOOR_DIVIDE , o_in , mult );
471+ if (mp_obj_is_true (mp_binary_op (MP_BINARY_OP_AND , floor , MP_OBJ_NEW_SMALL_INT (1 )))) {
472+ return mp_binary_op (MP_BINARY_OP_ADD , rounded , mult );
473+ } else {
474+ return rounded ;
475+ }
476+ }
477+ #endif
449478 }
450479#if MICROPY_PY_BUILTINS_FLOAT
451480 mp_float_t val = mp_obj_get_float (o_in );
0 commit comments