C++: как преобразовать из плавания для строкового представления без округления, усечения или дополнения? [дубликат]

Это можно исправить, передавая sonar.java.binaries инструментом maven.

mvn sonar: sonar -Dsonar.host.url = http: // localhost: 9000 -Dsonar.login = faeef1e48b8d00290a0f3cc00021720baf1ca4dd -Dsonar.java.binaries = D: \ aiwb_s **

6
задан Josh Lee 13 December 2010 в 19:09
поделиться

8 ответов

Невозможно точно представить десятичное число с основанием 10, используя значения с основанием 2, за исключением очень небольшого количества значений (например, 0,25). Чтобы получить то, что вам нужно, вы должны переключиться со встроенных типов float / double на какой-то пакет десятичных чисел.

6
ответ дан 8 December 2019 в 14:46
поделиться

Вы можете использовать boost :: lexical_cast следующим образом:

float blah = 0.01;
string w = boost::lexical_cast<string>( blah );

Переменная w будет содержать текстовое значение 0,00999999978. Но я не могу понять, когда это действительно нужно.

Для точного форматирования числа с плавающей запятой как строки рекомендуется использовать boost :: format . Следующий код показывает, как это сделать:

float blah = 0.01;
string w = str( boost::format("%d") % blah ); // w contains exactly "0.01" now
3
ответ дан 8 December 2019 в 14:46
поделиться

Посмотрите здесь Справочник по C ++ В частности, раздел о точности:

float blah = 0.01;
printf ("%.2f\n", blah);
2
ответ дан 8 December 2019 в 14:46
поделиться

Существует несчетное количество действительных чисел.

Существует только конечное число значений, которые типы данных float , double и long double может занять.

То есть будет несчетное количество действительных чисел, которые нельзя точно представить с использованием этих типов данных.

2
ответ дан 8 December 2019 в 14:46
поделиться

Чтобы ответить на ваш второй вопрос:

МОЖНО точно и недвусмысленно представить числа с плавающей запятой в виде строк. Однако для этого требуется шестнадцатеричное представление. Например, 1/16 = 0,1, а 10/16 равно 0.A.

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

Поскольку представление точное, преобразования обратимы: f == hexstring2float (float2hexstring (f))

0
ответ дан 8 December 2019 в 14:46
поделиться

Вам нужно проконсультироваться с вашим стандарты платформы, чтобы определить, как лучше всего определить правильный формат, вам нужно будет отобразить его как a * b ^ C, где 'a' - это интегральный компонент, содержащий знак, 'b' - это реализация, определенная (вероятно, исправлена ​​стандартом ), а 'C' - показатель степени, используемый для этого числа.

В качестве альтернативы, вы можете просто отобразить его в шестнадцатеричном формате, хотя для человека это ничего не значило бы, и оно все равно было бы двоичным для всех практических целей. (И такой же портативный!)

0
ответ дан 8 December 2019 в 14:46
поделиться

For (b), you could do

std::ostringstream os;
os << f;
std::string s = os.str();
0
ответ дан 8 December 2019 в 14:46
поделиться

Причина, по которой ваш отладчик дает другое значение, хорошо объяснена в сообщении Марка Рэнсома.

Что касается печати числа с плавающей запятой без округления, усечения и с большей точностью, вам не хватает точности спецификатор - точность по умолчанию для printf, как правило, составляет 6 знаков после дробной части.

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

float amount = 0.0099999998;
printf("%.10f", amount); 

В качестве дополнительного примечания, более удобный способ работы с C ++ (по сравнению с C-стилем) - это cout:

float amount = 0.0099999998;
cout.precision(10);
cout << amount << endl;
1
ответ дан 8 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: