如何在十进制小数点后分配两个浮点到C++中的另一个浮点

如何在十进制小数点后分配两个浮点到C++中的另一个浮点,c++,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

首先,我不想打印我的浮动。所以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进行所有计算。

intavg*100/100.0f
这就是逻辑。

根据评论,你似乎很难理解为什么不能有两个或任意数字的浮点

请容忍我,让我们做个练习。让我们在表示区间[0,50]中实数的3位上创建我们自己的数据类型。我们将其称为my_类型。因为我们只有3位,所以my_类型只能表示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_类型分配一个数字时,变量将得到最接近的可表示数字。例如:

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_类型变量中存储一个只有两位数字的数字。你不能。你不能。你不能。你能得到的最接近的值是12.5。让我们概括一下。你说我有一个值在区间内的数字[0,50.我想将其存储在只有两位小数的my_类型变量中。您不能。因为my_类型的内部表示法不处理十进制数字。有些值没有十进制数字,有些值有一位十进制数字,有些值有两位十进制数字。您唯一能做的就是用两位数字打印my_类型

浮点数的故事要复杂得多。数字存储在基数2中,有明确的规则。浮点数表示的一些数字有无限个十进制数字。一些十进制数字不能用浮点数表示,而选择了闭合表示。浮点数确实比我们的my_类型精度更高,但原则是一样的


如果您试图用两个十进制数字表示一个浮点数,您可能会发现该数字在浮点数中不可表示,并且选择了最接近的表示形式。例如,您可能会存储一个类似于x.749999999或x.7500002387的数字,而不是x.75。对于大数,精度损失甚至在所以你可以用16'777'217.0f来代替16'777'216.0f来存储一些东西。

我想你可以做一些事情,比如乘以100,转换为int,然后除以100.0,但是你确定这就是你想要的吗?浮点数没有数字。只有它们的字符串表示才有。你需要一个固定位置的表示来保证,比如represprese不,我正在计算一些数据文件的平均值。最后,我将打印它们,但为了显示它,我需要用一个在小数点后有两位数字的参数传递值。为什么不使用高度精确的值进行所有计算?你仍然不能输出小数点时,请运行小数点,这样可以避免累积错误。@James您似乎很固执地认为浮点不是这样工作的。浮点不是用十进制数字表示的,所以不,您绝对不能只有两个十进制数字的浮点。您唯一的选择是仅用两个十进制数字打印浮点两个十进制数字,或者使用一个用十进制数字表示实数的数据类型。这可能会将256.71转换为类似256.7099949483021的值。这就是为什么这段代码接近解决方案的原因。按照我想使用的方式,浮点数的工作方式或作用方式无关紧要。我只想在小数点和没什么。@James在你的问题中,你说,我不想打印我的浮点,但不,你说我只想在小数点后显示两位数字,就这样。这两个语句似乎相互矛盾。这是什么?谢谢你的缺点,这真的帮助了我作为一个新的代码学习者感觉不好,不管怎样,我找到了逻辑,是这样的:那更多的是l逻辑。@James所以解决方案是在您准备显示数字时使用printf及其格式标志。在评论框中,避免说谢谢,但我怎么可能不说谢谢?非常感谢。@James,不客气。如果答案对您有帮助,您可以投票表决。
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