将浮点结果数保存到第三位,C中没有舍入

时间:2017-07-12 17:18:52

标签: c floating-point rounding math.h cos

如何在第三位数后将结果舍入到第三位。

float result = cos(number);

请注意,我想将结果保存到第三位,没有舍入。不,我不想用.3f打印它,我需要将它保存为新值;

示例:

 0.00367 -> 0.003

N.B。 3之后不需要额外的零。

另外,我需要能够获得第3位数字。例如,如果它是0.0037212,我想获得3并在某些计算中将其用作int。

4 个答案:

答案 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);

Demo

<强>更新

问题已根据非常矛盾的要求进行更新。如果您有一个完全 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';