如何在 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.
}

您可以使用比率代替浮点数。用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.7499999999999x.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 这就是逻辑。

相关内容

  • 没有找到相关文章

最新更新