为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]
Posted
技术标签:
【中文标题】为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]【英文标题】:why % operator can not be used for float in C/C++ but can be used in Java and C#? [duplicate]为什么 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制] 【发布时间】:2014-12-28 07:54:26 【问题描述】:考虑下面的 C++ 程序:
#include <iostream>
int main()
float f = 9.9f, m = 3.3f;
float c = f % m;
std::cout << c;
return 0;
显示错误:Illegal use of floating point
当我用 Java 编写相同的程序时:
class Test
public static void main(String args[])
float f = 9.9f, m = 3.3f;
float c = f % m;
System.out.println(c);
给我输出:3.2999997
在 C# 中也是如此:
using System;
class Test
public static void Main()
float f = 9.9f, m = 3.3f;
float c = f % m;
Console.WriteLine(c);
给出输出:3.3
为什么相同的编程逻辑会以不同的语言提供三种不同的输出?为什么我们不能在 C/C++ 中将 modulo %
与浮点数一起使用,但可以在 Java 和 C# 中使用?
对不起,如果这是一个愚蠢的问题...我是学生...谢谢。
【问题讨论】:
因为%
的数学用法仅适用于整数。请改用fmod
。
@MarounMaroun 但为什么它适用于 java 和 C# 中的浮点数?
@MarounMaroun 不,不是重复的吗?你能解释一下它在 Java 和 C# 中的行为吗?
因为c/c++不是java也不是c#,所以它们在语法上相似,但也不同。
打开重复阅读接受的答案。您将得到答案,为什么它在 c++ 中是这样的,为什么在 c# 中,java 是这样的。因为他们做了这个功能。
【参考方案1】:
可能 C 和 C++ 没有它,因为有不止一种方法可以做到这一点:向零舍入 (fmod
) 和向最接近的整数舍入 (remainder
)。您必须知道(或查找)您引用的其他语言选择了哪些版本。
【讨论】:
但整数值也是如此。 @RudyVelthuis,不,我不这么认为。在我所知道的所有数学上下文中,整数除法是唯一定义的,从不等于舍入。 没有四舍五入,但模数可以朝向 0 或朝向负无穷大。所以,是的,整数也是如此。看看this page右边的表格就知道了。它要么是除数的符号,要么是被除数,总是正数,要么是实现定义,这取决于语言(即使在早期的 C 语言中,它也是实现定义的)。 特别是:> 定义【参考方案2】:我从here 找到了最简单的解决方案。
模运算符(余数运算符)返回除法的一部分 在非浮点运算的情况下丢弃(余数)。
所以当你有浮点模数时没有意义,因为 没有任何东西被丢弃。
e.g. int: 155 % 100 = 55 so, for integer division, 155 / 100 = 1 reminder = 55 and for floating point division: 155 / 100 = 1.55 remainder=0.0
所以,由于浮点除法时没有提醒,% 运算符不适用于浮点运算。
因此,在 C 等早期语言中,不支持 %
浮点运算符。
在 java 和 C# 中,余数的概念得到了扩展,在使用 %
运算符时,浮点数被视为一个数字,价格最多为 x 个小数点。
例如,Java 将采用 9.900000 % 3.300000 = 3.2999997
,而 C# 将采用 9.9 % 3.3 = 3.3
。因此,在使用%
时,这里的 9.900000 和所有浮点数都变成了价格编号。所以他们可以给余数。实际上,它们是 9.9xxxxxxxxxxxxxxxxxxxxx...(不精确)。
【讨论】:
请注意,它在 C++ 中称为 余数运算符。不是 模运算符。 @juanchopanza 我说的是普通数学……不是 C++。 关于“小数点”的最后一部分不太清楚。要点:浮点数是精确的,但二进制精确到x
位。舍入到 y
十进制数字不精确。
@MSalters 我无法理解...如果您知道,请编辑...我会批准的以上是关于为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]的主要内容,如果未能解决你的问题,请参考以下文章