Почему код целочисленного кода дает неверный ответ?
У меня очень простое разделение на Java (это количество продукта/производство в час), однако всякий раз, когда я делаю это разделение, я получаю странные ошибки:
float res = quantity / standard;
Я пробовал вышеупомянутое деление с несколькими значениями, и я всегда получаю ошибки, однако тот, который я пробовал везде и получил правильно, был следующим:
Всюду в мире:
13.6 = 6800 / 500;
Java:
13.0 = 6800 / 500;
Я исследовал BigDecimal и BigInteger, однако я не нашел способ создать это разделение с ними, есть ли другой способ сделать это разделение на Java без ошибок точности?
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Вы делите целые числа, что означает, что вы используете целочисленное деление.
В целых деления дробная часть результата отбрасывается.
Попробуйте следующее:
float res = (float) quantity / standard;
^^^^^^^
Вышеуказанное заставляет числитель обрабатываться как float
, который, в свою очередь, также способствует тому, чтобы знаменатель также плавал, и вместо int-деления выполняется float-деление.
Обратите внимание, что если вы имеете дело с литералами, вы можете изменить
float f = 6800 / 500;
включить суффикс f
, чтобы сделать знаменатель поплавком:
float f = 6800f / 500;
^
Ответ 2
Если вы беспокоитесь о точности, я бы предложил использовать double
, который более чем в два раза превышает число цифр. Однако с плавающей запятой только точно представляют дроби, которые являются суммой или степенями 0.5. Это означает, что 0,6 только приблизительно представлено. Это не должно быть проблемой при соответствующем округлении.
double d = (double) 6800 / 500;
или
double d = 6800.0 / 500;
Ответ 3
Привет, попробуйте это, он может помочь выполнить ваше требование
double percent=(7819140000l-3805200000l)*100f/7819140000l;
public String format_Decimal(double decimalNumber) {
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(5);
nf.setMinimumFractionDigits(2);
nf.setRoundingMode(RoundingMode.HALF_UP);
String x = nf.format(decimalNumber);
return x;
}
Ответ 4
В моем случае я делал это:
double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));
Вместо "правильного":
double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);