小数表达式的n项之和应该是浮点数时是整数

Posted

技术标签:

【中文标题】小数表达式的n项之和应该是浮点数时是整数【英文标题】:The sum of n terms of fractional expression is an integer when it should be a float 【发布时间】:2020-03-19 14:58:54 【问题描述】:

在下面的代码中为什么我没有得到一个有效的结果,除非我输入term = 1.0/n 而不是当term = 1/n。我已经将术语声明为浮动,这还不够吗?

#include <stdio.h>

int main()
    
     float sum = 0, term;
     int n, i;
     
     printf("enter the value of n:\n");
     scanf("%d", &n);
     term = 1.0 / n;
     for(i = 1; i <= n; i++)
       
        sum = term + sum; 
       
      
     printf("Sum = %.3f\n", sum);   
     
     return 0; 

【问题讨论】:

因为1intn 也是如此,所以你最终会得到整数除法。使用1.0 会导致浮点除法。 你想达到什么目的?总结1/nn 次只会给你1。你想要1 + 1/2 + 1/3 .. + 1/n吗? 我怀疑你想求和 1/i(或者更确切地说是 C 中的 1.0/i)。 表达式term = 1/n 的右轴是一个整数。在评估 RHS 时,LHS 的类型无关紧要。 【参考方案1】:

在下面的代码中为什么我没有得到一个有效的结果,除非我输入term = 1.0/n,而不是当term = 1/n。我已将term 声明为float。这还不够吗?

很遗憾没有。

ISO/IEC 9899:2017 §6.5.5 6 州:

整数相除时,/ 运算符的结果是去掉任何小数部分的代数商。105) 如果商a/b 是可表示的,则表达式(a/b)*b + a%b 应等于a [...]

105) 这通常被称为“向零截断”。

翻译:这两个整数相除的结果是一个整数。

即使将其分配给floatdouble 变量也不够,它会在分配之前被截断,解决方案是将小数表达式中的操作数之一转为浮点数或双精度数,例如你做到了。

【讨论】:

以上是关于小数表达式的n项之和应该是浮点数时是整数的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是浮点数还是整数?

如果是浮点数则显示小数点 2 位,如果是整数则显示小数点数 0 位 [重复]

运算符和表达式

Perl正则表达式提取浮点数

Python从菜鸟到高手:数字

Python从菜鸟到高手:数字