代码之家  ›  专栏  ›  技术社区  ›  Stradigos

假设浮点字面值是double类型?

c#
  •  4
  • Stradigos  · 技术社区  · 15 年前

    我在我的C课本中一直跟着,上面说“C假设所有浮点文字都是double类型。”我明白这是什么意思,但我不太确定如何将修复程序应用到我正在开发的示例程序中。

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace CoinCounter
    {
        class Program
        {
            static void Main(string[] args)
            {
                int quarters;
                int dimes;
                int nickels;
                int pennies;
                float myTotal = 0F;
    
                Console.Out.WriteLine("How many quarters are in the jar?");
                quarters = int.Parse(Console.In.ReadLine());
    
                Console.Out.WriteLine("How many dimes are in the jar?");
                dimes = int.Parse(Console.In.ReadLine());
    
                Console.Out.WriteLine("How many nickels are in the jar?");
                nickels = int.Parse(Console.In.ReadLine());
    
                Console.Out.WriteLine("How many pennies are in the jar?");
                pennies = int.Parse(Console.In.ReadLine());
    
                myTotal = (quarters * .25) + (dimes * .10) + (nickels  * .05) + (pennies * .01);
                Console.Out.Write("\nTotal: " + myTotal.ToString("c"));
    
                Console.In.ReadLine();
            }
        }
    }
    

    结果是:“无法隐式地将类型‘double’转换为‘float’。”当我试图将整行mytotal放在括号中,并在结尾添加一个f时,表示它正在寻找一个“;”。

    所以我的问题是,如何使用float?我怎么能在结尾加上F?我也试过用不同的方式在它前面铸造(浮子)。

    谢谢你抽出时间。

    3 回复  |  直到 15 年前
        1
  •  7
  •   Scott Smith    15 年前

    语言不会 隐含地 执行转换,因为它会导致精度损失。但是,你可以 明确地 使用转换执行转换:

    myTotal = (float)(
                  (quarters * .25)
                + (dimes    * .10)
                + (nickels  * .05)
                + (pennies  * .01)
              );
    

    在这种情况下,你知道你不是在处理天文数量或精细的高精度,所以这应该是好的。

    您还可以通过指定浮点文字而不是双精度来防止将值自动提升为双精度:

    myTotal = (quarters * .25F)
            + (dimes    * .10F)
            + (nickels  * .05F)
            + (pennies  * .01F);
    

    …… int 变量将提升为 float 对于加法运算,您将有一个 浮动 而不是 double 键入结果。

        2
  •  11
  •   Eric Lippert    15 年前

    你这里有更大的问题。 你不应该把财务数字表示成浮点数或双倍数 . c有一种专门用来表示财务数量的类型:十进制。

    你的代码应该是

    decimal myTotal = 0.00m;
    ...
    myTotal = (quarters * .25m) + (dimes * .10m) + (nickels  * .05m) + (pennies * .01m);  
    

    记住这一点的方法是:“M是为了钱”。

    另外,当我们在这里时,在将用户输入转换为数字时使用tryparse;用户可能键入一些不是数字的内容,然后您将得到一个异常。

        3
  •  1
  •   Gishu    15 年前
    myTotal = (quarters * .25f) + (dimes * .10f) + (nickels  * .05f) + (pennies * .01f);
    

    这样就可以了。
    将int与float相乘=gt;浮点结果
    在您的版本中,int*double(默认值)=>double results=>double total。
    尝试将它赋给float变量,编译器抱怨double-to-float转换必须是显式的(精度损失)。