为什么%运算符不能用于C / C ++中的float,但可以在Java和C#中使用?

时间:2014-12-28 07:54:27

标签: java c# c++ c floating-point

考虑用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#中使用?

对不起,如果这是一个愚蠢的问题......我是学生......谢谢。

2 个答案:

答案 0 :(得分:1)

可能C和C ++没有它,因为有多种方法可以做到这一点:向零舍入(fmod)并向最接近的整数(remainder舍入)。您必须知道(或查找)您引用的其他语言选择的版本。

答案 1 :(得分:-1)

我从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并且所有浮动变为价格no.s。所以他们可以给予其余的。实际上,它们是9.9xxxxxxxxxxxxxxxxxxx ...(不准确)。