我正在尝试制作一个简单的英尺到米转换器,但这会发生:
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;
}
}
}
这是我当前拥有的代码。起初,feet
和meter
是int,但是我不能将int除以3.281。我将它们更改为小数,现在出现此错误:
错误CS0019运算符'/'无法应用于以下类型的操作数 “十进制”和“双精度”
如果我不能将小数除以整数,并且不能在小数上使用/
符号,那我应该如何除以小数呢?
答案 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
变量,请使用后缀f
或F
,如以下示例所示:
float x = 3.5F;
double
但是,如果要将整数视为
double
,请使用后缀d
或D
,例如:
double x = 3D;
decimal
如果要将数字实数文字视为
decimal
,请使用后缀m
或M
,例如:
decimal myMoney = 300.5m;
在使用它之前,您应该真正确定实际上需要使用哪种类型。如果将 feet 转换为 meters ,我将使用double
或float
; 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;
}
decimal
类型通常用于保存货币值,其中double
和float
用于诸如此类的计算。另外,这不是必需的,但是如果您要使用多个相似类型,例如float
,double
,decimal
;最好使用每个后缀清楚地传达您打算使用的类型。
您可以像其他人所指出的那样强制转换为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}.");
}