@@ -896,6 +896,81 @@ def test_bit_length(self):
896896 self .assertEqual ((a + 1 ).bit_length (), i + 1 )
897897 self .assertEqual ((- a - 1 ).bit_length (), i + 1 )
898898
899+ def test_round (self ):
900+ # check round-half-even algorithm. For round to nearest ten;
901+ # rounding map is invariant under adding multiples of 20
902+ test_dict = {0 :0 , 1 :0 , 2 :0 , 3 :0 , 4 :0 , 5 :0 ,
903+ 6 :10 , 7 :10 , 8 :10 , 9 :10 , 10 :10 , 11 :10 , 12 :10 , 13 :10 , 14 :10 ,
904+ 15 :20 , 16 :20 , 17 :20 , 18 :20 , 19 :20 }
905+ for offset in range (- 520 , 520 , 20 ):
906+ for k , v in test_dict .items ():
907+ got = round (k + offset , - 1 )
908+ expected = v + offset
909+ self .assertEqual (got , expected )
910+ self .assert_ (type (got ) is int )
911+
912+ # larger second argument
913+ self .assertEqual (round (- 150 , - 2 ), - 200 )
914+ self .assertEqual (round (- 149 , - 2 ), - 100 )
915+ self .assertEqual (round (- 51 , - 2 ), - 100 )
916+ self .assertEqual (round (- 50 , - 2 ), 0 )
917+ self .assertEqual (round (- 49 , - 2 ), 0 )
918+ self .assertEqual (round (- 1 , - 2 ), 0 )
919+ self .assertEqual (round (0 , - 2 ), 0 )
920+ self .assertEqual (round (1 , - 2 ), 0 )
921+ self .assertEqual (round (49 , - 2 ), 0 )
922+ self .assertEqual (round (50 , - 2 ), 0 )
923+ self .assertEqual (round (51 , - 2 ), 100 )
924+ self .assertEqual (round (149 , - 2 ), 100 )
925+ self .assertEqual (round (150 , - 2 ), 200 )
926+ self .assertEqual (round (250 , - 2 ), 200 )
927+ self .assertEqual (round (251 , - 2 ), 300 )
928+ self .assertEqual (round (172500 , - 3 ), 172000 )
929+ self .assertEqual (round (173500 , - 3 ), 174000 )
930+ self .assertEqual (round (31415926535 , - 1 ), 31415926540 )
931+ self .assertEqual (round (31415926535 , - 2 ), 31415926500 )
932+ self .assertEqual (round (31415926535 , - 3 ), 31415927000 )
933+ self .assertEqual (round (31415926535 , - 4 ), 31415930000 )
934+ self .assertEqual (round (31415926535 , - 5 ), 31415900000 )
935+ self .assertEqual (round (31415926535 , - 6 ), 31416000000 )
936+ self .assertEqual (round (31415926535 , - 7 ), 31420000000 )
937+ self .assertEqual (round (31415926535 , - 8 ), 31400000000 )
938+ self .assertEqual (round (31415926535 , - 9 ), 31000000000 )
939+ self .assertEqual (round (31415926535 , - 10 ), 30000000000 )
940+ self .assertEqual (round (31415926535 , - 11 ), 0 )
941+ self .assertEqual (round (31415926535 , - 12 ), 0 )
942+ self .assertEqual (round (31415926535 , - 999 ), 0 )
943+
944+ # should get correct results even for huge inputs
945+ for k in range (10 , 100 ):
946+ got = round (10 ** k + 324678 , - 3 )
947+ expect = 10 ** k + 325000
948+ self .assertEqual (got , expect )
949+ self .assert_ (type (got ) is int )
950+
951+ # nonnegative second argument: round(x, n) should just return x
952+ for n in range (5 ):
953+ for i in range (100 ):
954+ x = random .randrange (- 10000 , 10000 )
955+ got = round (x , n )
956+ self .assertEqual (got , x )
957+ self .assert_ (type (got ) is int )
958+ for huge_n in 2 ** 31 - 1 , 2 ** 31 , 2 ** 63 - 1 , 2 ** 63 , 2 ** 100 , 10 ** 100 :
959+ self .assertEqual (round (8979323 , huge_n ), 8979323 )
960+
961+ # omitted second argument
962+ for i in range (100 ):
963+ x = random .randrange (- 10000 , 10000 )
964+ got = round (x )
965+ self .assertEqual (got , x )
966+ self .assert_ (type (got ) is int )
967+
968+ # bad second argument
969+ bad_exponents = ('brian' , 2.0 , 0j , None )
970+ for e in bad_exponents :
971+ self .assertRaises (TypeError , round , 3 , e )
972+
973+
899974
900975def test_main ():
901976 support .run_unittest (LongTest )
0 commit comments