@@ -861,6 +861,82 @@ def test_small_ints(self):
861861 self .assertTrue (i - i is 0 )
862862 self .assertTrue (0 * i is 0 )
863863
864+ def test_round (self ):
865+ # check round-half-even algorithm. For round to nearest ten;
866+ # rounding map is invariant under adding multiples of 20
867+ test_dict = {0 :0 , 1 :0 , 2 :0 , 3 :0 , 4 :0 , 5 :0 ,
868+ 6 :10 , 7 :10 , 8 :10 , 9 :10 , 10 :10 , 11 :10 , 12 :10 , 13 :10 , 14 :10 ,
869+ 15 :20 , 16 :20 , 17 :20 , 18 :20 , 19 :20 }
870+ for offset in range (- 520 , 520 , 20 ):
871+ for k , v in test_dict .items ():
872+ got = round (k + offset , - 1 )
873+ expected = v + offset
874+ self .assertEqual (got , expected )
875+ self .assert_ (type (got ) is int )
876+
877+ # larger second argument
878+ self .assertEqual (round (- 150 , - 2 ), - 200 )
879+ self .assertEqual (round (- 149 , - 2 ), - 100 )
880+ self .assertEqual (round (- 51 , - 2 ), - 100 )
881+ self .assertEqual (round (- 50 , - 2 ), 0 )
882+ self .assertEqual (round (- 49 , - 2 ), 0 )
883+ self .assertEqual (round (- 1 , - 2 ), 0 )
884+ self .assertEqual (round (0 , - 2 ), 0 )
885+ self .assertEqual (round (1 , - 2 ), 0 )
886+ self .assertEqual (round (49 , - 2 ), 0 )
887+ self .assertEqual (round (50 , - 2 ), 0 )
888+ self .assertEqual (round (51 , - 2 ), 100 )
889+ self .assertEqual (round (149 , - 2 ), 100 )
890+ self .assertEqual (round (150 , - 2 ), 200 )
891+ self .assertEqual (round (250 , - 2 ), 200 )
892+ self .assertEqual (round (251 , - 2 ), 300 )
893+ self .assertEqual (round (172500 , - 3 ), 172000 )
894+ self .assertEqual (round (173500 , - 3 ), 174000 )
895+ self .assertEqual (round (31415926535 , - 1 ), 31415926540 )
896+ self .assertEqual (round (31415926535 , - 2 ), 31415926500 )
897+ self .assertEqual (round (31415926535 , - 3 ), 31415927000 )
898+ self .assertEqual (round (31415926535 , - 4 ), 31415930000 )
899+ self .assertEqual (round (31415926535 , - 5 ), 31415900000 )
900+ self .assertEqual (round (31415926535 , - 6 ), 31416000000 )
901+ self .assertEqual (round (31415926535 , - 7 ), 31420000000 )
902+ self .assertEqual (round (31415926535 , - 8 ), 31400000000 )
903+ self .assertEqual (round (31415926535 , - 9 ), 31000000000 )
904+ self .assertEqual (round (31415926535 , - 10 ), 30000000000 )
905+ self .assertEqual (round (31415926535 , - 11 ), 0 )
906+ self .assertEqual (round (31415926535 , - 12 ), 0 )
907+ self .assertEqual (round (31415926535 , - 999 ), 0 )
908+
909+ # should get correct results even for huge inputs
910+ for k in range (10 , 100 ):
911+ got = round (10 ** k + 324678 , - 3 )
912+ expect = 10 ** k + 325000
913+ self .assertEqual (got , expect )
914+ self .assert_ (type (got ) is int )
915+
916+ # nonnegative second argument: round(x, n) should just return x
917+ for n in range (5 ):
918+ for i in range (100 ):
919+ x = random .randrange (- 10000 , 10000 )
920+ got = round (x , n )
921+ self .assertEqual (got , x )
922+ self .assert_ (type (got ) is int )
923+ for huge_n in 2 ** 31 - 1 , 2 ** 31 , 2 ** 63 - 1 , 2 ** 63 , 2 ** 100 , 10 ** 100 :
924+ self .assertEqual (round (8979323 , huge_n ), 8979323 )
925+
926+ # omitted second argument
927+ for i in range (100 ):
928+ x = random .randrange (- 10000 , 10000 )
929+ got = round (x )
930+ self .assertEqual (got , x )
931+ self .assert_ (type (got ) is int )
932+
933+ # bad second argument
934+ bad_exponents = ('brian' , 2.0 , 0j , None )
935+ for e in bad_exponents :
936+ self .assertRaises (TypeError , round , 3 , e )
937+
938+
939+
864940def test_main ():
865941 support .run_unittest (LongTest )
866942
0 commit comments