Почему этот код печатает 2.4099999999999997, а не только 2.41
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
Почему этот код печатает 2.4099999999999997, а не только 2.41
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
Проблема не в операторе по модулю, а в природе чисел с плавающей запятой. Двойник не может содержать точное значение 5,55, 3,14 или 2,41, поэтому вы получите приблизительный ответ.
Чтобы лучше понять это, попробуйте записать значение 1/3 в виде десятичной дроби, когда у вас есть ограниченное пространство на бумаге для его записи. В итоге вы получите что-то вроде 0.33333
, что является приблизительным значением фактического значения. То же самое происходит с 5.55, когда вы записываете его в двоичном формате - он превращается в 101.10001100110011001100110011...
, который где-то обрезается, чтобы соответствовать пространству двойника.
import java.text.DecimalFormat;
double d = 5.55%3.14;
DecimalFormat df = new DecimalFormat("#.##");
System.out.println( df.format( d ));
Добавить DecimalFormat
Редактировать:
Вы также можете
double d = 5.55%3.14;
System.out.printf("%1$.2f", d);
DecimalFormat df = new DecimalFormat("##.###################");
покажет вам ..
- person cIph3r; 22.02.2013
Java double может иметь проблемы с точностью.
Почему бы тебе не попробовать BigDecimal
?
import java.math.BigDecimal; public class Main { public static void main(String[] args) { final BigDecimal d = new BigDecimal(5.55); final BigDecimal APPROXPI = new BigDecimal(3.14); System.out.println(d.remainder(APPROXPI)); //2.409999999999999698019337301957421004772186279296875 } }
- person cIph3r; 22.02.2013
BigDecimal("5.55")
и BigDecimal("3.14")
, чтобы получить точные значения. Ознакомьтесь с этим объяснением.
- person Pshemo; 23.02.2013
import java.math.BigDecimal; public class Main { public static void main(String[] args) { final BigDecimal d = new BigDecimal("5.55"); final BigDecimal APPROXPI = new BigDecimal("3.14"); System.out.println(d.remainder(APPROXPI)); } }
И это абсолютно логично
- person cIph3r; 23.02.2013
причина в том, что java не выполняет математику так, как мы. java использует двоичные числа (из главы 4 большой книги Хорстманна по java), поэтому для компьютера 435 = 4 * 10 ^ 2 + 3 * 10 ^ 1 + 5 * 10 ^ 0
это происходит потому, что двоичными числами (1 или 0) легче манипулировать, поскольку переключатели в компьютере либо включены, либо выключены (1 или 0).
это приводит к случайным проблемам с округлением. если вы хотите заставить его округляться, тогда используйте десятичный формат, или если вам просто нужно округленное отображаемое значение, вы можете использовать String.format или printf