2017-03-08 491 views
-2

我已经写了一个程序,在这个程序中,计算机要求输入一个浮点数。来自用户。例如,如果我正在使用0.41,则printf中的输出为0.409999999。如何解决这个错误?如何四舍五入浮点数。到小数点后两位?

+2

读取例如[这个'printf'(和家庭)参考](http://en.cppreference.com/w/c/io/fprintf)。密切关注设置字段宽度的可能性,更重要的是设置* precision *。 –

+2

你没有显示你的printf代码。 – neuhaus

+0

你在哪个平台上? 0.41应该没有问题,即使在scanf中存储为普通32位系统的浮点数 – Ctx

回答

1

这很简单。用途:

printf("%.2f", 0.409999999); 

这将打印0.41

0

大多数浮点数据类型是,其性质,不精确。他们试图在有限精度的位向量中存储实数(无限精度)。因此,您的平台上0.41的最接近的表示可能为0.409999999。

您应该阅读IEEE754浮点表示法以了解您碰到的问题。

+0

细节:浮点数据类型非常精确,每个有限值都是精确的。使用这些类型的功能和操作是不精确的根源。 'double x = 0.41;''x'具有确切的值 - 可能是0.409999999999999975575093458246556110680103302001953125,它不等于0.41。 – chux

+0

@chux是的,因为他们在做什么,他们很精确。但他们没有无限的精确度。如果0.41变为0.4099 999,那么它接近但不精确为0.41。一个来自整数并从第一次开始浮动的新开发人员可能不会意识到这一点;因此想知道当他从0.41开始创建一个float时,他做了什么错误,并且只能获得真正接近该值的东西......当然,如果OP是一个拥有5年以上经验的软件工程师,那是一个简单*提问。对于新手来说,没关系(所以我给出了一个真正的答案,而不是“omg,你应该知道”)。 – ArchimedesMP

1
  • %F(打印为浮点)
  • %4F(打印为具有至少4宽的宽度的浮点)
  • %.4f(打印为具有精度浮点的小数点后4个字符)
  • %3.2F(打印为浮点至少3宽,精度为2)