C#中的英尺到米转换器已损坏?

时间:2019-01-16 15:06:57

标签: c# decimal division

我正在尝试制作一个简单的英尺到米转换器,但这会发生:

using System;
using System.Windows;
using System.Windows.Controls;

namespace CoolConversion
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        decimal feet;
        decimal meter;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            feet = Convert.ToDecimal(Feet.Text);
            meter = feet / 3.281;
        }
    }
}

这是我当前拥有的代码。起初,feetmeter是int,但是我不能将int除以3.281。我将它们更改为小数,现在出现此错误:

  

错误CS0019运算符'/'无法应用于以下类型的操作数   “十进制”和“双精度”

如果我不能将小数除以整数,并且不能在小数上使用/符号,那我应该如何除以小数呢?

2 个答案:

答案 0 :(得分:4)

默认情况下,3.281本身是一个双浮点精度数字。您可以通过在数字的末尾添加decimal来使用m字面符号。

meter = feet / 3.281m;

为简便起见,如果您曾经使用过声明为double的变量,则在需要对每个操作数使用两种不同类型进行计算的情况下,始终可以将其强制转换为小数

double feetToMeterValue = 3.281;
meter = feet / (decimal)feetToMeterValue;

这也适用于其他类型,但是要注意,当转换为特定类型(例如double> float以及更明显的decimal至{{1} }。

答案 1 :(得分:3)

这里的问题是编译器认为常量3.281的类型为double。如果打算使用诸如decimal之类的类型,则必须附加m后缀。同样,对于float类型,您必须附加f后缀。每个MSDN:

  

默认情况下,赋值运算符右侧的实数值文字被视为double


float

  

因此,要初始化float变量,请使用后缀fF,如以下示例所示:
  float x = 3.5F;


double

  

但是,如果要将整数视为double,请使用后缀dD,例如:
  double x = 3D;


decimal

  

如果要将数字实数文字视为decimal,请使用后缀mM,例如:
  decimal myMoney = 300.5m;


我的建议

在使用它之前,您应该真正确定实际上需要使用哪种类型。如果将 feet 转换为 meters ,我将使用doublefloatdouble通常是这样,因为它更精确。

private double feet = 0.0d;
private double meters = 0.0d;

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
    feet = Convert.ToDouble(Feet.Text);
    meters = feet / 3.281d;
}

decimal类型通常用于保存货币值,其中doublefloat用于诸如此类的计算。另外,这不是必需的,但是如果您要使用多个相似类型,例如floatdoubledecimal;最好使用每个后缀清楚地传达您打算使用的类型。


最后通知

您可以像其他人所指出的那样强制转换为decimal,但是当您仅使用decimal指定3.281m时,这是不必要的强制转换。在性能至关重要的环境中,应尽可能避免不必要的转换。

另一方面,您应该真正确保要转换的文本是有效值,然后再尝试将其转换。我更喜欢使用TryParse(如果我没记错的话,所有数字类型都应使用TryParse方法)。其背后的原因是,如果我按照您的方法当前的工作方式在文本框中输入123a,则此方法将立即爆炸。解决这个问题很简单:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
    if (double.TryParse(Feet.Text, out feet))
        meters = feet / 3.281d;
    else
        MessageBox.Show($"You've entered an invalid value: {Feet.Text}.");
}