How to search for a specific character in a QString
-
What I need is showing a double result. It may be a very small negative/positive number (say, -0.000000001234) or a very big positive/negative number (say, +2500000000036540). It's range I should cover by code.
I only need the 'number of' digits after the decimal point. Then I will use another method to use 'that number' precision for the output.
@SGaist:
Very good info, thanks.
But the lineEdit there, is used to "show" the result of a calculation. (My calculator works fine but I just want to make it more precise).
QDoubleSpinBox has two buttons and works in essence like an editable cadre, while I just need "to show" the result (and also save the current result for the next expressions). -
double d = 12000000.0; QString s = QString::number(d,'f',std::numeric_limits<decltype(d)>::max_digits10); if(s.contains('.')){ int i=s.size()-1; for(;s.at(i)=='0';--i){} s=s.left(i+ (s.at(i)=='.' ? 0:1)); }
Edit:
alternative:
// needs #include <cmath> double d = 12000000.0; double junk; int precision=0; for(double tester=d;!qFuzzyIsNull(std::modf(tester,&junk));++precision,tester*=10.0){} QString s = QString::number(d,'f',precision);
-
@VRonin
Thank you.Both have flaws. But also both have high level of precision.
I think the flaws belong to the way numbers are stored in registers. And I think there is no completely (100%) accurate calculator in the world because of that.I chose the latter. Thanks for your help. I'm appreciative.
-
@matthew.kuiash
I have used as high precision as possible for doubles using VRonin's code.
I think I'm at the end. The differences between what we expect and what is shown using the code may happen for low of high precisions because of the difference of the way we and the machine calculate expressions. -
QDoubleSpinBox can be used as you mentioned
You still have to hard code the precision (number of decimals) shown so it does not solve the problem
The differences between what we expect and what is shown using the code may happen for low of high precisions
The maximum number of digits that can be represented in text is is
std::numeric_limits<double>::digits10
, you can't get meaningful results if you go beyond this limit -
@zapprox
You pointed to a good matter —hiding the buttons of that widget. As SGaist had suggested it firstly, I would like to use it because I thought it would solve the problems of those double numbers we were involving since above posts. But when VRonin subsequently said, it seems that we don't get more benefits of it compared to the chosen code.Thank you all.
-
Didn't we discuss these precision things recently, I have a distinct impression we are running a loop ...
This thread comes to mind. -
@kshegunov
No.
The earlier issue was about the way that makes us able to show our result (say, 1000000) in real number mode not scientific.
But after that, (this thread), we should be able to show the number of the precision suitable for each number as a result.
We don't want to e.g., show 12.25 as 12.25000000 (just because we are able to show number in real mode). For the matter of accuracy, the user of the app expects to see the result in a professional way.
Hope this helps.PS: I wish we wouldn't have anything named "storing numbers in binary mode" and "scientific notation". ;)
-
I use this:
double tester = d; double junk; int precision = 0; for(;!qFuzzyCompare(0.0,std::modf(tester,&junk));++precision,tester*=10.0){} QString s = QString::number(d,'f',precision); return s;
How might this face a problem please?
I want to test it on the app. -
from http://doc.qt.io/qt-5/qtglobal.html#qFuzzyCompare
Note that comparing values where either p1 or p2 is 0.0 will not work
so instead of
qFuzzyCompare(0.0,std::modf(tester,&junk))
useqFuzzyIsNull(std::modf(tester,&junk))