首先,我不想打印我的花车。所以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.
}
答案 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.75
或x.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 就是这样。