- Удобство чтения человеком. Предпочитайте от 1000 до 1e3 или от 0,125 до 1,25e-1.
- Сохраняйте точность. Предпочитайте от 3.1415926535897931 до 3.14.
- Избегайте использования ложных цифр в десятичных числах. Предпочитайте от 0,1 до 0,10000000000000001.
Другие люди используют форматирование по умолчанию на основе "%.17g", которое соответствует требованиям 1 и 2, но не 3. Число 0,2, например, отформатировано как 0,20000000000000001.
Между этим формат "%.16g" близок к выполнению требований 2 и 3, но не всегда для обоих.
В качестве иллюстрации я желаю 0,3 будет отформатировано как 0,3, а 0,1+0,2, которое немного больше из-за ошибок округления, будет отформатировано как 0,30000000000000004, чтобы увидеть разницу.
Я написал следующую функцию, которая форматирует числа с плавающей запятой так, как я хочу, в качестве доказательства концепции. Однако это неприемлемо с точки зрения производительности, поскольку оно может выполнять до 34 преобразований между двойными и строками, что дает ограниченный прирост точности по сравнению с текущей реализацией с "%.15g".
Код: Выделить всё
std::string doubleToString(double number)
{
char buffer[32];
long long intVal = static_cast(number);
if(intVal == number)
{
sprintf(buffer, "%lld", intVal);
}
else
{
for(int i=1; i>> 0.3
0.3
>>> 0.1+0.2
0.30000000000000004
>>>
Подробнее здесь: https://stackoverflow.com/questions/658 ... -of-digits
Мобильная версия