如何在C++中把双值循环到2位小数?

如何在C++中把双值循环到2位小数?,c++,C++,假设我有如下一些计算: double a = 99.44, result; result = 99.44 / 100 * 99.5; 结果中存储的值将为98.9428。如何将值四舍五入到98.94并存储到结果中 setprecision方法只能在cout期间对值进行四舍五入,但我希望存储的值进行四舍五入以供进一步计算。您可以使用以下算法: 乘以100 四舍五入到最近的整数 除以100 由于乘法可能溢出,该算法存在非常接近最大可表示值的大值问题 另一种方法是像处理std::cout but s

假设我有如下一些计算:

double a = 99.44, result;

result = 99.44 / 100 * 99.5;
结果中存储的值将为98.9428。如何将值四舍五入到98.94并存储到结果中


setprecision方法只能在cout期间对值进行四舍五入,但我希望存储的值进行四舍五入以供进一步计算。

您可以使用以下算法:

乘以100 四舍五入到最近的整数 除以100 由于乘法可能溢出,该算法存在非常接近最大可表示值的大值问题


另一种方法是像处理std::cout but stream一样使用流操纵器,将其转换为字符串,然后将该字符串转换回浮点数。这要慢得多,但没有上面提到的警告。

您可以使用以下算法:

乘以100 四舍五入到最近的整数 除以100 由于乘法可能溢出,该算法存在非常接近最大可表示值的大值问题


另一种方法是像处理std::cout but stream一样使用流操纵器,将其转换为字符串,然后将该字符串转换回浮点数。这要慢得多,但没有上面提到的警告。

您不能。浮点变量没有小数点:它们有二进制位,与小数点不可通约


如果需要小数位数,则必须使用小数基数,例如在格式化输出时。

您不能。浮点变量没有小数点:它们有二进制位,与小数点不可通约


如果需要小数位数,则必须使用小数基数,例如在格式化输出时。

是否要存储可能不可能的舍入值或显示舍入值?@Someprogrammerdude要存储舍入值,我建议您乘以100,转换为整数类型,然后除以100.0。由于浮点值在二进制计算机上的工作方式,可能仍然无法存储精确的值。@Someprogrammerdude这是我唯一能做的方法吗?您想存储可能不可能的舍入值还是显示舍入值?@Someprogrammerdude要存储舍入值,我建议您乘以100,强制转换为整数类型,并用100.0除。由于浮点值在二进制计算机上的工作方式,可能仍然无法存储准确的值。@某个程序员说这是我唯一能做的方法吗?反驳。@EJP我认为你的测试有问题。即使是0.03%0.01!=0.0是正确的。您忽略了一个事实,即并非所有数字都可以用浮点数表示。舍入点,实际上,对浮点进行任何计算,无论是整数还是小数点,都是为了得到与准确结果最接近的可表示值;有时会有一些错误。现在,也许这个算法在这方面是错误的,但你的测试似乎并不能证明这一点。“并非所有的数字都可以用浮点数表示的事实”是测试的重点。这就是它证明的。如果存在0.01的浮点表示形式,精确到小数点后两位,则它将通过。没有。QED。@EJP我明白了。然后它对我建议的算法没有任何反驳,是的。您建议的算法依赖于FP能够准确地表示0.01之类的数字。已被驳斥。@EJP我认为您的测试是错误的。即使是0.03%0.01!=0.0是正确的。您忽略了一个事实,即并非所有数字都可以用浮点数表示。舍入点,实际上,对浮点进行任何计算,无论是整数还是小数点,都是为了得到与准确结果最接近的可表示值;有时会有一些错误。现在,也许这个算法在这方面是错误的,但你的测试似乎并不能证明这一点。“并非所有的数字都可以用浮点数表示的事实”是测试的重点。这就是它证明的。如果存在0.01的浮点表示形式,精确到小数点后两位,则它将通过。没有。QED。@EJP我明白了。然后它对我建议的算法没有任何反驳,是的。您建议的算法依赖于FP能够准确地表示数字,例如0.01。