Я изо всех сил пытался понять концепцию ошибок округления в Java с плавающей точкой. Хотя я понимаю, что double не предполагается использовать для финансовых расчетов, я не понимаю, почему переменная 'd' не достигает 0.0. Как я могу получить это, чтобы распечатать первый println?Почему числа с плавающей запятой имеют ошибки округления?
package zetcom;
public class floatingComparison {
public static void main(String[] args) {
double r = Math.sqrt(2);
double d = r * r - 2;
if (d == 0)
{
System.out.println("sqrt(2) squared minus 2 is 0");
}
else
{
System.out.println("sqrt(2) squared minus 2 is " + d);
}
}
}
Любое объяснение будет оценено.
Почему бы вам не округлить до 0 десятичных знаков? Я не уверен, что он возвращает, но если вы когда-либо работаете с поплавками, это хорошая идея, чтобы явным образом указать переменной, сколько десятичных знаков вы хотите иметь. Очевидно, что, как утверждают ответы, вы не можете иметь бесконечную точность в конечной системе. – user1274820
Это вопрос, который был задан ad nauseum - я голосую, чтобы отметить это как дублирующий вопрос с большим количеством хорошо написанных ответов и ссылок. – Krease
Обратите внимание, что 'Math.sqrt (x * x)' всегда выдает то же значение, что и 'x' (запрет переполнения или переполнение). Но это теорема. –