Разделение целочисленных типов - предсказуемы ли результаты? - PullRequest
1 голос
/ 09 ноября 2011

У меня есть 64-битная длина, которую я хочу округлить до ближайших 10000, поэтому я делаю простое:

long myLong = 123456789
long rounded = (myLong / 10000) * 10000; //rounded = 123450000

Это похоже на то, что я ожидаю, но так как яне 100% на внутреннем уровне того, как целочисленные типы делятся, я просто немного обеспокоен тем, что могут быть ситуации, когда это не будет работать должным образом.

Будет ли это работать при очень больших числах / крайних случаях?

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

Да, это будет работать, пока результат, промежуточный или иной, не превысит long.MaxValue.

Чтобы быть ясным в отношении ваших констант, вы можете использовать спецификатор L в конце, например, 123456789L.

Для простых вычислений, подобных этому, могу ли я предложить Pex от Microsoft (http://research.microsoft.com/en-us/projects/pex/), которая ищет крайние случаи и тестирует их. Это чистый пример, но если вы строили много логики, основанной на вещах, в которых вы не уверены, это отличный инструмент.

1 голос
/ 09 ноября 2011

Да, это будет работать.Семантика целочисленного деления гарантирует то, что вы ожидаете.

Однако может быть полезно написать некоторые тесты для вашего конкретного случая использования, включая крайние варианты.Это вас успокоит.

...