C++ 我可以将-0.000打印为0.000吗?

C++ 我可以将-0.000打印为0.000吗?,c++,printf,double,double-precision,negative-zero,C++,Printf,Double,Double Precision,Negative Zero,这将输出-0.000,但它不应该是0.000 如何在没有减号的情况下进行打印,即0.000?C++继承了C的printf。在C11标准§7.21.6.1中的fprintf函数中,脚注显示: 负零和四舍五入为零的负值的所有浮点转换的结果, 包括一个减号 C++继承了C的printf。在C11标准§7.21.6.1中的fprintf函数中,脚注说明: 负零和四舍五入为零的负值的所有浮点转换的结果, 包括一个减号 浮点表示()有一个符号位。实现printf的人决定显式地将它放在那里,即使所有打印的数字

这将输出
-0.000
,但它不应该是
0.000


如何在没有减号的情况下进行打印,即
0.000

C++继承了C的
printf
。在C11标准§7.21.6.1中的
fprintf
函数中,脚注显示:

负零和四舍五入为零的负值的所有浮点转换的结果, 包括一个减号


C++继承了C的
printf
。在C11标准§7.21.6.1中的
fprintf
函数中,脚注说明:

负零和四舍五入为零的负值的所有浮点转换的结果, 包括一个减号


浮点表示()有一个符号位。实现printf的人决定显式地将它放在那里,即使所有打印的数字都是0

浮点表示()有符号位。实现printf的人决定显式地将它放在那里,即使所有打印的数字都是0

正确答案已经给出。只是想补充一下,你将从C++ +cOUT/P>中得到同样的结果。 如果你想摆脱这个标志,可以这样做:

printf("%.3lf\n", -0.0001);

编辑 在不转换为字符串的情况下是否可以执行此操作

那么:

-0.000
-0.000
0.000
所以它似乎起作用了

但它不适用于所有舍入模式


因此,使用带有字符串转换的第一个版本似乎更安全。

已经给出了正确的答案。只是想补充一下,你将从C++ +cOUT/P>中得到同样的结果。 如果你想摆脱这个标志,可以这样做:

printf("%.3lf\n", -0.0001);

编辑 在不转换为字符串的情况下是否可以执行此操作

那么:

-0.000
-0.000
0.000
所以它似乎起作用了

但它不适用于所有舍入模式


因此,将第一个版本与字符串转换一起使用似乎更安全。

编辑:我以前的解决方案没有解决问题

-0.001
-0.001
-0.001
------------------------
-0.000
0.000
0.000
因此,printf在使用精度时似乎也会舍入值

--------------------------- 旧答案,请忽略: 在打印答案之前,您可以使用此选项对答案进行四舍五入:

printf: 12345.68
printf: 12345.12

round : 12345.68
round : 12345.12

floor : 12345.67
floor : 12345.12

ceil  : 12345.68
ceil  : 12345.13
模板
双圈(双a)
{
自动倍增器=标准::功率(10,精度);
a*=乘数;
a=标准::圆形(a);
a/=乘数;
返回a;
}
或者,如果您只想剪切其余部分:

template <int precision>
double round(double a)
{
    auto multiplier = std::pow(10, precision);
    a *= multiplier;
    a = std::round(a);
    a /= multiplier;
    return a;
}
模板
双圆向下(双a)
{
自动倍增器=标准::功率(10,精度);
a*=乘数;
a=标准::楼层(a);
a/=乘数;
返回a;
}
即使在精度为负的情况下也可以这样做:

template <int precision>
double round_down(double a)
{
    auto multiplier = std::pow(10, precision);
    a *= multiplier;
    a = std::floor(a);
    a /= multiplier;
    return a;
}
intmain()
{
//精确地旋转
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.6789
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.6790
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.6800
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.7000
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12346.0000
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12350.0000
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12300.0000
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12000.0000
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=10000.0000
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=0.0000
//精确后的截断/舍入
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12345.6789
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12345.6780
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12345.6700
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12345.6000
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12345.0000
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12340.0000
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12300.0000
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=12000.0000
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=10000.0000
printf(“%5.4lf\n”,向下舍入(12345.6789));//输出=0.0000
}
替代解决方案,允许定义舍入方法:

int main()
{
    //Round at precision
    printf("%5.4lf\n", round<4>(12345.6789));           //Output = 12345.6789
    printf("%5.4lf\n", round<3>(12345.6789));           //Output = 12345.6790
    printf("%5.4lf\n", round<2>(12345.6789));           //Output = 12345.6800
    printf("%5.4lf\n", round<1>(12345.6789));           //Output = 12345.7000
    printf("%5.4lf\n", round<0>(12345.6789));           //Output = 12346.0000
    printf("%5.4lf\n", round<-1>(12345.6789));          //Output = 12350.0000
    printf("%5.4lf\n", round<-2>(12345.6789));          //Output = 12300.0000
    printf("%5.4lf\n", round<-3>(12345.6789));          //Output = 12000.0000
    printf("%5.4lf\n", round<-4>(12345.6789));          //Output = 10000.0000
    printf("%5.4lf\n", round<-5>(12345.6789));          //Output = 0.0000

    //Cut off/Round down after precision
    printf("%5.4lf\n", round_down<4>(12345.6789));      //Output = 12345.6789
    printf("%5.4lf\n", round_down<3>(12345.6789));      //Output = 12345.6780
    printf("%5.4lf\n", round_down<2>(12345.6789));      //Output = 12345.6700
    printf("%5.4lf\n", round_down<1>(12345.6789));      //Output = 12345.6000
    printf("%5.4lf\n", round_down<0>(12345.6789));      //Output = 12345.0000
    printf("%5.4lf\n", round_down<-1>(12345.6789));     //Output = 12340.0000
    printf("%5.4lf\n", round_down<-2>(12345.6789));     //Output = 12300.0000
    printf("%5.4lf\n", round_down<-3>(12345.6789));     //Output = 12000.0000
    printf("%5.4lf\n", round_down<-4>(12345.6789));     //Output = 10000.0000
    printf("%5.4lf\n", round_down<-5>(12345.6789));     //Output = 0.0000
}
模板
双圈(双a)
{
自动倍增器=标准::功率(10,精度);
a*=乘数;
a=圆形函数(a);
a/=乘数;
返回a;
}
int main()
{
printf(“%05.4lf\n”,四舍五入(12345.6789));//输出=12345.0000
printf(“%05.4lf\n”,四舍五入(12345.6789));//输出=12345.7000
printf(“%05.4lf\n”,四舍五入(12345.6789));//输出=12345.7000
printf(“%05.4lf\n”,四舍五入(12345.6789));//输出=12345.6000
printf(“%05.4lf\n”,四舍五入(12345.6789));//输出=12345.7000
}

编辑:我以前的解决方案没有解决问题

-0.001
-0.001
-0.001
------------------------
-0.000
0.000
0.000
因此,printf在使用精度时似乎也会舍入值

--------------------------- 旧答案,请忽略: 在打印答案之前,您可以使用此选项对答案进行四舍五入:

printf: 12345.68
printf: 12345.12

round : 12345.68
round : 12345.12

floor : 12345.67
floor : 12345.12

ceil  : 12345.68
ceil  : 12345.13
模板
双圈(双a)
{
自动倍增器=标准::功率(10,精度);
a*=乘数;
a=标准::圆形(a);
a/=乘数;
返回a;
}
或者,如果您只想剪切其余部分:

template <int precision>
double round(double a)
{
    auto multiplier = std::pow(10, precision);
    a *= multiplier;
    a = std::round(a);
    a /= multiplier;
    return a;
}
模板
双圆向下(双a)
{
自动倍增器=标准::功率(10,精度);
a*=乘数;
a=标准::楼层(a);
a/=乘数;
返回a;
}
即使在精度为负的情况下也可以这样做:

template <int precision>
double round_down(double a)
{
    auto multiplier = std::pow(10, precision);
    a *= multiplier;
    a = std::floor(a);
    a /= multiplier;
    return a;
}
intmain()
{
//精确地旋转
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.6789
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.6790
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.6800
printf(“%5.4lf\n”,四舍五入(12345.6789));//输出=12345.7000
printf(“%5.4lf\n”,圆形(12345.6789));