如何控制双精度计算以避免C++;linux x86_64? 在Linux X8664中的C++代码中,我需要双精度计算(+或--)。p>

如何控制双精度计算以避免C++;linux x86_64? 在Linux X8664中的C++代码中,我需要双精度计算(+或--)。p>,c++,algorithm,double,precision,rounding-error,C++,Algorithm,Double,Precision,Rounding Error,26.1000000000001-26+0.100000000000001 我得到: 200000000000000143 我想得到0.2 这里,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较小数点后的4位数字 这似乎是一个舍入错误 如何将计算精度限制在小数点后4位 为了避免开销,我不想调用任何函数 由于转换开销,我不想使用stringstream 还有更好的主意吗 谢谢如果您只想打印它,您可以使用printf(“%10.4lf”)。当然,您可以

26.1000000000001-26+0.100000000000001

我得到:

200000000000000143

我想得到0.2


这里,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较小数点后的4位数字

这似乎是一个舍入错误

如何将计算精度限制在小数点后4位

为了避免开销,我不想调用任何函数

由于转换开销,我不想使用stringstream

还有更好的主意吗


谢谢

如果您只想打印它,您可以使用printf(“%10.4lf”)。当然,您可以根据需要更改精度。

如果您只想打印它,可以使用printf(“%10.4lf”)。当然,您可以根据需要更改精度。

计算精度很好。这是您试图控制的显示精度。如果使用
,则可以使用
setprecision()
执行此操作;如果使用
则可以使用类似
“%.4f”的格式化程序执行此操作

您已经在调用函数,因为您正在将结果显示为十进制

p.S.
0.1
不能用
float
double
或任何二进制尾数格式精确表示。它被分解为
(1/2)*(1/5)
,十进制
1/5
是一个无限重复的二进制数字序列


p.p.S.去看看。这可能是你最大的希望。

计算精度很好。这是您试图控制的显示精度。如果使用
,则可以使用
setprecision()
执行此操作;如果使用
则可以使用类似
“%.4f”的格式化程序执行此操作

您已经在调用函数,因为您正在将结果显示为十进制

p.S.
0.1
不能用
float
double
或任何二进制尾数格式精确表示。它被分解为
(1/2)*(1/5)
,十进制
1/5
是一个无限重复的二进制数字序列


p.p.S.去看看。这可能是你最大的希望。

如果你只对小数点后四位以内的相等感兴趣,那么将所有内容乘以10000并使用整数运算。(您可能需要在乘以10000后进行四舍五入。)

如果您只对小数点后四位以内的相等感兴趣,请将所有内容乘以10000并使用整数运算。(乘以10000后可能需要四舍五入。)

此处,显示格式不是导入,计算结果将用于某些if-else分支条件。所以,我只想用if-else条件比较小数点后的4位数字。哦,你的意思是显示格式不重要!好啊您可以尝试乘以10^(精度)[在您的情况下精度为4]。此处,显示格式不是导入,计算结果将用于某些if-else分支条件。所以,我只想用if-else条件比较小数点后的4位数字。哦,你的意思是显示格式不重要!好啊您可以尝试乘以10^(精度)[在您的情况下精度为4]。此处,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较十进制数字后的4位。@user100228您试图用二进制浮点来做的事情是不可能的。再多的舍入技巧也不会使二进制浮点上的十进制算法像magic一样工作。@user1002288您只需在所有浮点精度比较中添加一些magic
epsilon
值。像
if(a==b){}
转换成
if(abs(a-b)<1e-4){}
。这是使用浮点算法可以做的最好的事情。在这里,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较十进制数字后的4位。@user100228您试图用二进制浮点来做的事情是不可能的。再多的舍入技巧也不会使二进制浮点上的十进制算法像magic一样工作。@user1002288您只需在所有浮点精度比较中添加一些magic
epsilon
值。像
if(a==b){}
转换成
if(abs(a-b)<1e-4){}
。这是使用浮点算法可以做的最好的事情。