Почему / когда использовать поплавки вместо BigDecimal

Это может быть наивный или загруженный вопрос, но после того, как у меня возникли проблемы с отладкой чисел с плавающей запятой, у меня есть вопрос:

Если есть проблемы с округлением чисел с плавающей точкой из-за разницы между основанием 2 и базой 10 между числами с плавающей точкой и большими десятичными числами... почему / когда вы использовали бы числа с плавающей точкой и большие десятичные числа?

Почти все основные языки программирования имеют библиотеку BigDecimal... soo

Мне кажется, что точность в математике превосходит любое увеличение производительности, которое вы получите, используя поплавки….. так почему же мир программного обеспечения не отказался от поплавков и не сказал: "Извините, мы идем ва-банк на BigDecimal "?

2 ответа

Решение

Ключевой вопрос заключается в том, выиграет ли ваше приложение от точного представления конечных десятичных дробей.

Возможность точно представлять числа, такие как 1,01, очень и очень полезна в финансовых расчетах.

С другой стороны, когда вы имеете дело с физическими измерениями, десятичный результат сам по себе является лишь приблизительным. Я не верю, что какая-либо физическая величина была измерена с точностью до 64-разрядного числа с плавающей запятой IEEE 754, самой распространенной реализации типа double.

Существует заблуждение, что библиотеки BigDecimal устраняют проблемы с округлением. Они помогают только с числами, которые точно представлены в виде достаточно коротких десятичных дробей. BigDecimal не лучше, чем double при представлении одной трети.

Предположим, вы собираете огромный набор данных измерений. Вы знаете, что ваши датчики уже дают 5% ошибок. Почему вы хотите потратить много дополнительной вычислительной мощности для достижения 100% правильных вычислений на этих данных?! И скажем, мы не говорим о 10 МБ данных; но 10 тб. Или петабайт. Вы все еще уверены, что стоит использовать BigDecimal для обработки этих данных?

Другими словами: есть много случаев, когда вам абсолютно не нужны эти 100% правильности. И тогда вы не готовы платить цену, связанную с этим 100%.

Я полностью согласен: как только мы говорим о числах, которые представляют валюту, например, мы делаем все возможное, чтобы избежать ошибок округления. Но нам просто не нужно обрабатывать все данные одинаково. Потому что в реальном мире существует много разных требований; и хорошая разработка - это выбор инструмента, который обеспечивает оптимальное решение с учетом таких ограничений.

Другие вопросы по тегам