Это можно исправить, передавая sonar.java.binaries инструментом maven.
mvn sonar: sonar -Dsonar.host.url = http: // localhost: 9000 -Dsonar.login = faeef1e48b8d00290a0f3cc00021720baf1ca4dd -Dsonar.java.binaries = D: \ aiwb_s **
Невозможно точно представить десятичное число с основанием 10, используя значения с основанием 2, за исключением очень небольшого количества значений (например, 0,25). Чтобы получить то, что вам нужно, вы должны переключиться со встроенных типов float / double на какой-то пакет десятичных чисел.
Вы можете использовать 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
Посмотрите здесь Справочник по C ++ В частности, раздел о точности:
float blah = 0.01;
printf ("%.2f\n", blah);
Существует несчетное количество действительных чисел.
Существует только конечное число значений, которые типы данных float
, double
и long double
может занять.
То есть будет несчетное количество действительных чисел, которые нельзя точно представить с использованием этих типов данных.
Чтобы ответить на ваш второй вопрос:
МОЖНО точно и недвусмысленно представить числа с плавающей запятой в виде строк. Однако для этого требуется шестнадцатеричное представление. Например, 1/16 = 0,1, а 10/16 равно 0.A.
С помощью шестнадцатеричных чисел с плавающей запятой вы можете определить каноническое представление. Я лично использовал бы фиксированное количество цифр, представляющих базовое количество бит, но вы также можете удалить конечные нули. Нет никакой путаницы в том, какие конечные цифры равны нулю.
Поскольку представление точное, преобразования обратимы: f == hexstring2float (float2hexstring (f))
Вам нужно проконсультироваться с вашим стандарты платформы, чтобы определить, как лучше всего определить правильный формат, вам нужно будет отобразить его как a * b ^ C, где 'a' - это интегральный компонент, содержащий знак, 'b' - это реализация, определенная (вероятно, исправлена стандартом ), а 'C' - показатель степени, используемый для этого числа.
В качестве альтернативы, вы можете просто отобразить его в шестнадцатеричном формате, хотя для человека это ничего не значило бы, и оно все равно было бы двоичным для всех практических целей. (И такой же портативный!)
For (b), you could do
std::ostringstream os;
os << f;
std::string s = os.str();
Причина, по которой ваш отладчик дает другое значение, хорошо объяснена в сообщении Марка Рэнсома.
Что касается печати числа с плавающей запятой без округления, усечения и с большей точностью, вам не хватает точности спецификатор - точность по умолчанию для printf, как правило, составляет 6 знаков после дробной части.
попробуйте следующее, чтобы получить точность в 10 знаков:
float amount = 0.0099999998;
printf("%.10f", amount);
В качестве дополнительного примечания, более удобный способ работы с C ++ (по сравнению с C-стилем) - это cout:
float amount = 0.0099999998;
cout.precision(10);
cout << amount << endl;