C++ 四舍五入双精度小数点后2位

C++ 四舍五入双精度小数点后2位,c++,double,rounding,C++,Double,Rounding,我有一双像这样的眼睛: 0.04251789 double d = 0.04251789; double rounded = std::floor(f * 1000000) / 1000000; 它应该是这样的: 0.04251700 无论最后两位数字是什么,都应替换为00; 重要的是,最后两位数字不能丢失,而应替换为00 因此: 0.042517 那就错了 实现这一目标的最快方法是什么 我有一双像这样的眼睛: 0.04251789 double d = 0.04251789; dou

我有一双像这样的眼睛:

0.04251789
double d = 0.04251789;
double rounded = std::floor(f * 1000000) / 1000000;
它应该是这样的:

0.04251700
无论最后两位数字是什么,都应替换为00; 重要的是,最后两位数字不能丢失,而应替换为00

因此:

0.042517
那就错了

实现这一目标的最快方法是什么

我有一双像这样的眼睛:

0.04251789
double d = 0.04251789;
double rounded = std::floor(f * 1000000) / 1000000;
0.04251789

它应该是这样的:

0.04251789
double d = 0.04251789;
double rounded = std::floor(f * 1000000) / 1000000;
0.04251700

您希望向下舍入到最接近的
1.0/1000000
。可以这样做:

0.04251789
double d = 0.04251789;
double rounded = std::floor(f * 1000000) / 1000000;
因此:

0.042517
0.042517

那就错了

double
转换为字符串时,只需指定正确的精度。您需要8位数字,因此:

std::printf("%.8f", rounded);
转换为字符串不是一个选项


这与您的要求相矛盾,即数字必须有尾随的零。尾随(和前导)零仅在数字的文本表示中有意义。

因为它需要是字符串,否则您将无法显示零,c解决方案可以是:

char temp[128];
memset(temp,'\0',sizeof(temp));
sprintf(temp,"%10.8f",0.04251789);
temp[strlen(temp)-1]='0';
temp[strlen(temp)-2]='0';
printf(temp);

这是一个c-way,它不是最好的,但我应该做你想做的

int main( void ) {
    double number = 0.04251789;
    char buffer[10];
    snprintf(buffer, sizeof(buffer), "%g", number);
    buffer[8] = '0';
    buffer[9] = '0';
    std::cout << "Converted Number: " << buffer << std::endl;
}
int main(无效){
双倍数字=0.04251789;
字符缓冲区[10];
snprintf(缓冲区,sizeof(缓冲区),“%g”,数字);
缓冲区[8]=“0”;
缓冲区[9]=“0”;

std::cout那么它只是用于显示吗?它被发送到和WebAPI,他们希望它正好有8位数字。转换为字符串不是一个选项。假设API(基于web)如果不需要不可移植的二进制数据,您迟早要将其转换为字符串。在四舍五入后,在创建字符串时只需指定正确的字段宽度和精度。因此API需要一个8位浮点而不是字符串?您不可能这样做。双精度浮点不包含“一定数量的位数”。它包含(通常)尾数的53位、符号位和指数的10位。将其转换为字符串时,可以指定位数,但作为双精度,0.5和0.50000000之间没有差异。