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

Jax*_*n98 5 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

错误 CS0019 运算符“/”不能应用于“decimal”和“double”类型的操作数

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

Per*_*alJ 5

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

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


float

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


double

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


decimal

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


我的建议

在使用之前,您应该真正确定您实际需要使用哪种类型。在将英尺转换为的情况下,我会使用doublefloat; double通常是这种情况,因为它更精确。

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;
}
Run Code Online (Sandbox Code Playgroud)

decimal类型通常用于保存货币值,其中doublefloat用于此类计算。此外,这不是必需的,但是如果您曾经使用过多种类似的类型,例如float, double, decimal; 为每个使用后缀以清楚地传达您打算使用的类型总是一个好主意。


最后说明

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

另一方面,在尝试转换之前,您确实应该确保尝试转换的文本是有效值。我更喜欢使用TryParseTryParse如果我没记错的话,所有数字类型都应该有一个方法)。这背后的原因是,如果我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}.");
}
Run Code Online (Sandbox Code Playgroud)