«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Пункт Избегайте чисел с плавающей запятой и двойной точности, если требуются точные ответы.

Пункт Избегайте чисел с плавающей запятой и двойной точности, если требуются точные ответы.

Опубликовано 6 ноября 2024 г.
Просматривать:162

Item  Evite o float e o double caso sejam necessárias respostas exatas

Проблема с float и double:

  • Предназначен для научных и математических вычислений, выполнения двоичных арифметических операций с плавающей запятой.
  • Не подходит для денежных расчетов или ситуаций, требующих точных ответов.
  • Невозможно точно представить отрицательные степени десяти, например 0,1, что приводит к ошибкам.

Пример 1:
Неправильный расчет при вычитании сумм в долларах:

System.out.println(1.03 - 0.42);  // Resultado: 0.6100000000000001

Пример 2:
Ошибка при покупке девяти предметов по 10 центов каждый:

System.out.println(1.00 - 9 * 0.10);  // Resultado: 0.09999999999999998

Даже при округлении ошибки сохраняются.
Проблема с прогрессивными расчетами, например, при покупке сладостей по возрастающей цене от 0,10 до 1,00.

Пример 3:
Ошибка при покупке сладостей, пока у вас не закончатся деньги:

double funds = 1.00;
for (double price = 0.10; funds >= price; price  = 0.10) {
    funds -= price;
}
System.out.println(funds);  // Resultado: 0.3999999999999999

Решение 1. Используйте BigDecimal

  • Идеально подходит для финансовых расчетов и ситуаций, когда точность важна.
  • Избегайте использования двойного конструктора BigDecimal, предпочитая конструктор String.

Пример с BigDecimal:

BigDecimal funds = new BigDecimal("1.00");
BigDecimal price = new BigDecimal("0.10");
int itemsBought = 0;

while (funds.compareTo(price) >= 0) {
    funds = funds.subtract(price);
    price = price.add(new BigDecimal("0.10"));
    itemsBought  ;
}
System.out.println(itemsBought   " items bought. Money left: "   funds);  
// Resultado: 4 items bought. Money left: 0.00

Теперь расчет стал точным.

Недостатки BigDecimal:

  • Менее удобно использовать, чем примитивные типы.
  • Медленнее, особенно при больших объемах операций.

Решение 2. Используйте int или long

  • Чтобы избежать проблем с точностью, рассчитывайте в центах, используя int или long вместо долларов с помощью double.

Пример с целым числом (в центах):

int funds = 100;  // 1.00 dólar = 100 centavos
int price = 10;   // 0.10 dólar = 10 centavos
int itemsBought = 0;

while (funds >= price) {
    funds -= price;
    price  = 10;
    itemsBought  ;
}
System.out.println(itemsBought   " items bought. Money left: "   funds);  
// Resultado: 4 items bought. Money left: 0

Расчет быстрый и точный.

Заключение:

  • Не используйте float или double для вычислений, требующих точной точности.
  • Используйте BigDecimal для денежных расчетов или ситуаций, требующих десятичной точности.
  • Используйте int или long для финансовых расчетов, которые не требуют больших чисел, выполняя вычисления в центах.

Выбор:

  • Для длины до 9 цифр используйте целое число.
  • Для длины до 18 цифр используйте длинные.
  • Для больших количеств используйте BigDecimal.
  • Это резюме показывает, что в зависимости от контекста выбор между BigDecimal, int или long может оптимизировать как точность, так и производительность.
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/giselecoder/item-60-evite-o-float-e-o-double-caso-sejam-necessarias-respostas-exatas-3mep?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3