如何在第三位数后将结果舍入到第三位。
float result = cos(number);
请注意,我想将结果保存到第三位,没有舍入。不,我不想用.3f打印它,我需要将它保存为新值;
示例:
0.00367 -> 0.003
N.B。 3之后不需要额外的零。
另外,我需要能够获得第3位数字。例如,如果它是0.0037212,我想获得3并在某些计算中将其用作int。
答案 0 :(得分:3)
0.00367 - > 0.003
float
通常可以精确地代表约2 32 个不同的值。 <{1}}和0.00367
不在该集合中。
距离0.003
最近的float
是0.0036700000055134296417236328125
距离0.00367
最近的float
是0.0030000000260770320892333984375
我想将结果保存到第三位
这个目标需要妥协。将结果保存为接近0.001的倍数的0.003__
。
按1000.0缩放,截断并除以1000.0将适用于大多数值。
float
以上为float y1 = truncf(x * 1000.0f) / 1000.0f;
和x.xxx000...
附近的某些值提供了稍微错误的答案。使用更高的精度可以解决这个问题。
x.xxx999...
我想获得3并在某些计算中将其用作int。
跳过取消缩放部分,只保留1位数字float y2 = (float) (trunc(x * 1000.0) / 1000.0);
。
fmod()
最后,我怀疑这种方法并不能完全满足OP未说明的用法,并且在某些计算中将其用作int digit = (int) fmod((trunc(x * 1000.0), 10);
digit = abs(digit);
。&#34;。 FP数学有很多字幕,特别是在尝试使用二进制 FP时,就像大多数int
一样,采用某种十进制方式。
也许以下内容将符合OP的目标,即使它某些舍入。:
double
答案 1 :(得分:2)
您可以向上缩放值,使用trunc
截断为零,然后缩小:
float result = trunc(cos(number) * 1000) / 1000;
请注意,由于浮点数的不精确性,结果不会是精确值。
如果您希望专门提取第三个十进制数字,可以按如下方式进行:
int digit = (int)(result * 1000) % 10;
这将对数字进行缩放,使有问题的数字位于小数点的左侧,然后提取该数字。
答案 2 :(得分:1)
您可以从0.001
除以它的余数来除去它:
result -= fmod(result, 0.001);
<强>更新强>
问题已根据非常矛盾的要求进行更新。如果您有一个完全 0.003
数字,则会有无限个零后的数字,并且它是数字的数学属性。 OTOH,float
表示不能保证精确表示每个精确数字的3个十进制数字。要解决此问题,您需要放弃使用float
类型并切换到某种固定点表示。
答案 3 :(得分:0)
Overkill,使用sprintf()
double /* or float */ val = 0.00385475337;
if (val < 0) exit(EXIT_FAILURE);
if (val >= 1) exit(EXIT_FAILURE);
char tmp[55];
sprintf(tmp, "%.50f", val);
int third_digit = tmp[4] - '0';