运算符“<”不能应用于“decimal”和“double”类型的操作数

Operator '<' cannot be applied to operands of type 'decimal' and 'double'

提问人:Abdulhamid 提问时间:3/8/2016 最后编辑:IanAbdulhamid 更新时间:3/8/2016 访问量:23245

问:

我正在尝试提出一个程序来计算从用户输入中给出的成绩。我还试图设置用户输入可以有多高或多低的限制(即 0 <= 或 >= 100)。但是当我使用十进制时,它一直给我这个错误,“运算符'<'不能应用于'十进制'和'双精度'类型的操作数”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Grade_Program
{
    class Program
    {
        static void Main(string[] args)
        {
            string First;
            string Last;
            First = "Cristiano";
            Last = " Ronaldo";
            Console.Write("Please enter student name <First Last>: ");
            Console.WriteLine(First + Last );

            Console.WriteLine(" ");

                                                     Console.WriteLine("*************NOTE**********************************************");
        Console.WriteLine("*** Be sure to include decimal point for scores.            ***");
        Console.WriteLine("***     !!!All score should range from 0.00 to 100.00 !!    ***");
        Console.WriteLine("***                                                         ***");
        Console.WriteLine("*** For example : 80.50                                     ***");
        Console.WriteLine("***************************************************************");

        Console.WriteLine(" ");

        decimal Exam_1;
        decimal Exam_2;
        decimal Exam_3;
        decimal Assignment_1;
        decimal Assignment_2;

        Console.Write("Please enter score for Exam 1 <Example: 100.0>: ");
        Exam_1 = Convert.ToDecimal(Console.ReadLine());

        if (Exam_1 < 0.0 | Exam_1 > 100.0)
            Console.Write("Exam score cannot be less than 0. or greater than                      100.0. Please re-enter the score for Exam 1 <Example: 95.0>:");
            Exam_1 = Convert.ToDecimal(Console.ReadLine());

        Console.Write("Please enter score for Exam 2 <Example: 0.0>: ");
        Exam_2 = Convert.ToDecimal(Console.ReadLine());
C# .NET 比较

评论

1赞 souldzin 3/8/2016
尝试 (ref: msdn.microsoft.com/en-us/library/364x0z75.aspx0M <= myDecimal || 100M >= myDecimal)
0赞 Sasa1234 3/8/2016
大多数情况下,此错误是由于铸造问题而出现的。如果您粘贴代码,我们可以给出正确的答案。

答:

5赞 Isuru Rangana 3/8/2016 #1

对于十进制,您必须在值中添加“M”后缀以告诉计算机它是小数。否则计算机会将其视为双重。

urDecimal < 98.56M;

28赞 Ian 3/8/2016 #2

我在您的代码中至少注意到了四个问题。

首先,如前所述,您应该使用后缀来告诉 C# 编译器它是可接受的比较:Mdecimal

if (Exam_1 < 0.0M | Exam_1 > 100.0M)

其次,用代替,因为你想做操作,而不是|||ORBitwise-OR

if (Exam_1 < 0.0M || Exam_1 > 100.0M) //change | to ||

第三,我认为对你来说,知道这一点非常重要:你不需要考试分数的数据类型(除非你的考试分数可以是 99.123456789012345567890123455 - 这是不可能的)。decimal

decimal通常用于需要非常高精度的数字(例如在银行中计算),精度不超过 16 位。如果你的考试成绩不需要它,就不要使用,这是矫枉过正。只需为您的使用 or 或,您很可能在正确的轨道上。moneydecimaldoubleintfloatExams

第四,关于你的错误处理,这是不正确的处理方式:

if (Exam_1 < 0.0 | Exam_1 > 100.0)
    Console.Write("Exam score cannot be less than 0. or greater than                      100.0. Please re-enter the score for Exam 1 <Example: 95.0>:");
    Exam_1 = Convert.ToDecimal(Console.ReadLine());

原因有二:

  1. 你在块外面(没有括号)Exam_1{}
  2. 你使用,而你应该使用ifwhile

这是正确的方法:

double Exam_1 = -1; //I use double to simplify

Console.Write("Please enter score for Exam 1 <Example: 100.0>: ");
Exam_1 = Convert.ToDouble(Console.ReadLine());

while (Exam_1 < 0.0 || Exam_1 > 100.0) { //see the curly bracket
    Console.Write("Exam score cannot be less than 0. or greater than                      100.0. Please re-enter the score for Exam 1 <Example: 95.0>:");
    Exam_1 = Convert.ToDouble(Console.ReadLine());
} //see the end curly bracket

在 C# 语言中,缩进并不意味着作用域,这与 Python 等语言不同。

评论

1赞 Ian 3/8/2016
@Abdulhamid不...您的错误处理(术语中的“循环”,但实际上并非如此)似乎是另一个问题......不幸。。
0赞 Abdulhamid 3/8/2016
你能解释一下这个问题,这样我以后就不会遇到它了吗?
0赞 Abdulhamid 3/8/2016
在扫描时,我注意到您刚刚给我的方式并没有将用户输入限制为“十进制”(即 2.0 而不是 2)
1赞 Ian 3/8/2016
@Abdulhamid是的,通常我们不会强迫用户在不更改值的情况下放置额外的零。这是因为行为可以区分这一点。如果你想把限制放进去,那么即使也不会有任何效果。相反,您需要的是一个自定义字符串检查器 - 制作起来可能会很麻烦,而且几乎没有好处。因此,人们通常不会这样做。Convert.ToDouble.00decimal
1赞 David Pine 3/8/2016 #3

正如其他人已经指出的那样。若要使用大于或小于运算符比较类型,必须将其与另一种类型进行比较。为了将文字数字声明为小数,它需要 or 后缀。以下是有关该类型的 MSDN 以供参考。decimaldecimalMmdecimal

if (Exam_1 < 0.0m || Exam_1 > 100.0m)

下面是修复程序的 .NET 小提琴。