如何限制C++代码中浮点变量的小数点?

qv7cva1a  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(129)

如何在c++中声明具有指定小数点数量的变量(float)?

std::vector<float> gradeVector={}

gradeVector的数据类型不是一个浮点数(5位小数),我需要它是一个只有2位小数(到百位)的浮点数。
(Read我的用户名)

bwitn5fc

bwitn5fc1#

这不可能计算机的浮点格式在内部是二进制的,而不是十进制的。如果你想要一个特定的十进制舍入或截断,你必须乘以一个数字10,并将该逻辑应用于整数。
我怀疑你真的只关心打印/输出时的正确舍入,因为这是唯一一次数字被表示为十进制(记住:十进制、二进制、十六进制:这些只是记录相同数字的不同方式,而不是数字本身)。对于iostreams,有setprecision方法。
如果你的分数算术真的有特殊的规则,这些规则与最终几乎无限高精度和舍入的计算不一样,你将不得不编写自己的数值类型,可能,它覆盖了所有的乘法,加法......您希望数字具有的运算符。

mcdcgff0

mcdcgff02#

C++中的浮点数几乎总是基于“IEEE 754”标准。在该标准中,浮点数大致是0和1之间的二进制十进制数加上指数项。
因此,浮点数的值是(分数部分)乘以2^(指数部分)。
这不能很好地Map到基数为10的数字。一个32位的浮点数有8位的指数部分(包括一个指数符号位),一个符号位,和23位的分数(有一些欺骗使其排序为24)组成部分。
现在,你所描述的往往是想要的。你通常用整数,然后除以100。
现在,这些整数本身在某些情况下可以是浮点值(!),但是通过将“最低精度”作为整数来处理,四舍五入更容易考虑。
对于许多用途,唯一关心它是一个固定数量的十进制数字的时候是在输出它的时候。情况并非总是如此;一个银行账户实际上记录了你有多少便士,并且不支持一个账户中有3.14159便士。
如果你需要精确到小数点后2位的精确度来进行所有的数学运算,存储int s,当你显示它的时候,使用这个:

void print_2_digit( int x ) {
  if (x<0) {
    printf("-%d.%02d", (-x)/100, (-x)%100);
  } else {
    printf("%d.%02d", (x)/100, (x)%100);
  }
}

或等同物。

int multiply_2_digit(int x, int y) {
  return x*y/100;
}
int divide_2_digit(int x, int y) {
  return (x*100)/y;
}

如果你对C++有点熟练,你可以用一个类来做这件事。
但是,如果您只关心打印的内容,那么有很多方法可以将浮点数的打印方式更改为固定数量的十进制数字。

相关问题