如何在不四舍五入小数点值的情况下获得精确的小数精度值?
How to get a exact decimal precision value without rounding the decimal point value?
我必须将双精度值转换为 CString 才能在 mfc 列表框中显示它。在显示它之前,我需要将小数点格式化为我需要的位数。
例如这里我需要将double值格式化为2位数字
double a = 4217.088;
CString str;
str.Format("%.*lf",2,a);
这里a的赋值为4217.088。我需要格式化的 str 值为 4217.08 但小数点值四舍五入为 4217.09
我也尝试了下面的 floor 方法,但这也给了我同样的结果。
double b;
b = floor(a * 100) / 100;
是否可以在不四舍五入小数点的情况下格式化双精度值。
四舍五入根本不起作用。在您的情况下,8 中的下一个数字大于 5,因此它将下一个数字转换为 9。
要解决您的问题,以下代码应该可以解决问题:
double b = std::floor(a * 100.) / 100.;
如果您想要简单截断而不是四舍五入,您可以格式化为 3 位小数,然后截断结果:
double a = 4217.088;
CString str;
str.Format("%.*lf", 3, a);
str = str.Left(str.GetLength() - 1);
// str contains now "4217.08"
但这也有效:
double a = 4217.088;
str.Format("%.*lf", 2, std::floor(a * 100) /100);
我必须将双精度值转换为 CString 才能在 mfc 列表框中显示它。在显示它之前,我需要将小数点格式化为我需要的位数。
例如这里我需要将double值格式化为2位数字
double a = 4217.088;
CString str;
str.Format("%.*lf",2,a);
这里a的赋值为4217.088。我需要格式化的 str 值为 4217.08 但小数点值四舍五入为 4217.09
我也尝试了下面的 floor 方法,但这也给了我同样的结果。
double b;
b = floor(a * 100) / 100;
是否可以在不四舍五入小数点的情况下格式化双精度值。
四舍五入根本不起作用。在您的情况下,8 中的下一个数字大于 5,因此它将下一个数字转换为 9。 要解决您的问题,以下代码应该可以解决问题:
double b = std::floor(a * 100.) / 100.;
如果您想要简单截断而不是四舍五入,您可以格式化为 3 位小数,然后截断结果:
double a = 4217.088;
CString str;
str.Format("%.*lf", 3, a);
str = str.Left(str.GetLength() - 1);
// str contains now "4217.08"
但这也有效:
double a = 4217.088;
str.Format("%.*lf", 2, std::floor(a * 100) /100);