Почему математика не округляет мой номер?Джава - PullRequest
0 голосов
/ 22 марта 2019

Попытка написать этот скрипт, который работает со входами, которые часто исчисляются сотнями миллиардов. Тем не менее, Math.ceil не будет округляться вверх?

int clayturns  = (int)Math.ceil(clayneeded / 7500000000L);
System.out.println((int) Math.ceil(clayneeded / 7500000000L));
System.out.println("we need " + clayturns + "turns");
System.out.println("we need " + clayneeded + " clay added to our specific village.");

здесь у меня есть вывод консоли eclipse. Как видите, глины не пустые. Как будто это так, тогда глины всегда должны быть чем-то, это не может быть нулем, но это так.

we need 0turns
we need 3021588634 clay needed to our specific village.

Пожалуйста, дайте мне знать, что вы думаете. Разве математика не работает с Лонгами?

Ответы [ 3 ]

3 голосов
/ 22 марта 2019

равно clayneeded и int / long? если вы делаете int / long деление, оно обрезает любой дробный компонент, прежде чем достигнет Math.ceil. Учитывая размер ваших входных данных, я бы держался подальше от float s / double s и использовал BigDecimal s для точной математики здесь.

0 голосов
/ 22 марта 2019

Это потому, что вы храните переменную Clayturns внутри целого числа.Происходит переполнение целочисленного значения, которое возвращает 0.

Максимальное значение для целого числа составляет + 2 147 483 647.

0 голосов
/ 22 марта 2019

Похоже, clayneeded имеет целочисленный тип (вероятно, long). Таким образом, clayneeded/7500000000L - это целочисленное деление (частное), поэтому ceil вычисляет потолок целого числа, то есть самого.

Таким образом, вы можете вычислить это следующим образом (если остаток от целочисленного деления не равен нулю, то потолок должен произвести следующее целое число):

long remainder = clayneeded % 7500000000L;
long result = (clayneeded/7500000000L)+(remainder!=0?1:0);
...