首先,我不想打印我的浮点数。所以 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.
}
您可以使用比率代替浮点数。用std::centi
(1/100(进行所有计算。
根据评论,您似乎很难理解为什么不能使用两个(或任何数字(数字的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 个十进制数字,有些值有两个。您唯一能做的就是用两位数打印my_type
。
float
的故事要复杂得多。这些数字以 2 为基数存储,并且有明确定义的规则。float
表示的某些数字具有无限数量的十进制数字。某些十进制数不能用float
表示,而是选择可表示的收盘价。的确,float
比我们的my_type
精度更高,但原理是一样的。
如果尝试在float
中用两个十进制数字表示数字,您可能会发现该数字无法在float
中表示,并且选择了最接近的表示形式。例如,您可以存储一个实际上类似于x.7499999999999
或x.7500002387
的数字,而不是x.75
。对于大数字,丢失的精度甚至在点之前,因此您可以存储类似16'777'216.0f
的东西而不是16'777'217.0f
。
#include <cmath>
float two_decimal_places(float f) {
return std::floor(f * 100.0) / 100.0;
}
听起来您需要了解浮点值与其表示为字符之间的区别。在打印出来之前,您几乎无法控制值的精度。
int(avg * 100(/100.0f 这就是逻辑。