В настоящее время у меня есть что-то вроде этого
float a = SomeQString.toFloat(); //QString has 2.37
Теперь число с плавающей точкой 2.3690000031 ..
Что я хочу, это 2.3700000000 .. какие-либо предложения о том, как я мог бы сделать это? Кроме того, почему я получаю 2,369 вместо 2,37?
(Был спрошен и объяснен так много раз.) Невозможно получить 2.37
в float
, Не возможно получить 2.37
в double
, Не возможно получить 2.37
в любом двоичном формате с плавающей точкой в стиле IEEE-754. 2.37
не представляется точно в таких двоичных форматах с плавающей точкой.
Читать Что каждый компьютерщик должен знать об арифметике с плавающей точкой
Один жизнеспособный способ «получить» 2.37
на самом деле хранить это 2.369...
в float
(что вы уже делаете), а затем округлите его до 2.37
в то время, когда вам нужно будет сгенерировать десятичное представление, то есть в то время, когда вам нужно представить / вывести значение пользователю.
#include <string>
#include <sstream>
int main(void)
{
std::string QString = "2.37";
std::istringstream StrToFloat(QString );
float floatVar;
StrToFloat >> floatVar;
return 0;
}
Если вы настаиваете на использовании Qt, этот код вам подходит:
#include <QString>
#include <QTextStream>
#include <QDebug>
using namespace std;
int main()
{
QString floatString = "2.37";
QTextStream floatTextStream(&floatString);
float f;
floatTextStream >> f;
qDebug() << f;
return 0;
}
Запустите следующую команду, например, с gcc и Qt 5 (или чем-то похожим, если у вас другой сценарий):
Команда: g++ -I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core -fPIC main.cpp && ./a.out
Выход: 2.37
Тем не менее, вам не нужно QString для этого. Смотрите код ниже, который генерирует вывод 2.37
как и ожидалось.
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
string floatString = "2.37";
istringstream floatStringStream(floatString);
float f;
floatStringStream >> f;
cout << f;
return 0;
}
Запустите следующую команду с gcc, например (или что-то подобное, если у вас другой сценарий):
Команда: g++ main.cpp && ./a.out
Выход: 2.37