如何在C ++中将小数点后两位数字的浮点数分配给另一个浮点数

时间:2018-10-19 21:55:12

标签: c++

首先,我不想打印我的花车。所以printf(“%。2f”,x)对我不起作用。我已经检查了setprecision(),它对我不起作用。

这是我的代码

#include <iostream>
using namespace std;
int main()
{
    float obtained = 256.714964;
    float usable = 256.71; // I want to make obtained float with two digits 
                           // after decimal point without any round.
}

5 个答案:

答案 0 :(得分:2)

您可以使用ratio而不是浮点数。用std::centi(1/100分之一)进行所有计算。

答案 1 :(得分:2)

基于注释,您似乎很难理解为什么不能使用带有两个(或任意数量)数字的float

请忍受我,让我们做运动。让我们在3位上创建自己的数据类型,这些数据类型表示间隔[0, 50)中的实数。让我们称之为my_type。因为我们只有3位,所以my_type只能表示8个值。我们希望值在间隔中均匀分布。因此,我们选择在间隔中以50 / 8 = 6.25的增量递增。

这就是我们得到的:

Internal representation  |  Represented Value (real number)
                 (bits)  |
-------------------------+--------------------------
                     000 |  0
                     001 |  6.25
                     010 | 12.5
                     011 | 18.75
                     100 | 25
                     101 | 31.25
                     110 | 37.5
                     111 | 43.75

这是我们的数据类型。只有这8个数字可以表示。当我们为my_type分配一个数字时,变量将获得最接近的可表示数字。因此,例如:

my_type a1 = 10;      // a1 is 12.5
my_type a2 = 31.1471; // a2 is 31.25
my_type a3 = 25.789;  // a3 is 25
my_type a4 = 29.89;   // a4 is 31.25

现在您说:我有一个数字12.67893,我想在一个my_type变量中存储仅2位数字的数字。你不能你根本做不到。您可以拥有的最接近的值为12.5。让我们概括一下。您说我有一个数字,其值的间隔为[0, 50)。我想将其存储在my_type变量中,且仅保留两位小数。你不能因为my_type的内部表示不处理十进制数字。有些值没有小数位,有些值有1个小数位,有些值有2个。您唯一可以做的就是用两位数字打印my_type

float的故事要复杂得多。数字存储在以2为底的基础上,并且有明确定义的规则。由float表示的某些数字具有无限数量的十进制数字。某些十进制数字不能用float表示,因此选择了可表示的闭合值。的确,float比我们的my_type具有更高的精度,但是原理是相同的。

如果尝试在float中表示一个带有两位十进制数字的数字,则可能会发现该数字在float中无法表示,并选择了最接近的表示形式。例如,您可以存储一个实际上类似于x.75x.7499999999999的数字,而不是x.7500002387。对于大数,精度损失甚至在点之前,因此您可以存储16'777'217.0f之类的东西来代替16'777'216.0f

答案 2 :(得分:-1)

#include <cmath>

float two_decimal_places(float f) {
    return std::floor(f * 100.0) / 100.0;
}

答案 3 :(得分:-1)

听起来您需要了解浮点值及其以字符表示的区别。在打印出来之前,您几乎无法控制该值的精度。

答案 4 :(得分:-1)

int(平均* 100)/ 100.0f 就是这样。