Не используйте float
, если вы можете этого избежать. Проблема здесь заключается в том, что %f
обрабатывает его как двойной, когда он не имеет ту точность
String input = "33.3";
double num = Double.parseDouble(input);
System.out.printf("num: %f\n",num);
отпечатки
33.300000
Это происходит потому, что 33.3f! = 33,3, как float
имеет меньшую точность. Чтобы увидеть фактические значения, вы можете использовать BigDecimal, который точно отражает фактическое значение.
System.out.println("33.3f = " + new BigDecimal(33.3f));
System.out.println("33.3 = " + new BigDecimal(33.3));
печатает
33.3f = 33.299999237060546875
33.3 = 33.2999999999999971578290569595992565155029296875
Как вы можете видеть истинное значение, представленное немного слишком мал, в обоих случаях. В случае, как %f
показывает 6 знаков после запятой, даже если флоат не точен до 8 десятичных знаков. double
с точностью до 15-16 знаков после запятой, и поэтому вы не увидите ошибку, если значение не намного больше. например один триллион или более.
Точка плавающей точки. Проверьте http://floating-point-gui.de – yshavit
http://stackoverflow.com/q/6713673/1053938 – jonhopkins
Спасибо за указатели @yshavit – Froggy