内置的Checked模块具有所有整数类型的转换,但不包含float(System.Double)或float32(System.Single)的转换。
为什么会这样?
如果我需要为float或float32转换可能是也可能不是整数类型的数字,是否有任何推荐的替代方法?
是否有用于转换为整数类型的内置函数,还检查输入是否没有小数部分? string constants = "A:<<Default>>;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:<<Default>>";
string placeHolder = string.Empty;
List<string> filteredkeys = new List<string>();
List<string> formattedKeys = new List<string>();
filteredkeys.Add("A:aaa;E:eee;");
filteredkeys.Add("D:ddd;");
filteredkeys.Add("B:bbb;E:eee;");
foreach (var item in filteredkeys)
{
placeHolder = constants;
List<string> keyCombination = item.TrimEnd(';').Split(';').ToList();
foreach (string keys in keyCombination)
{
List<string> abc = keys.Split(':').ToList();
switch (abc[0])
{
case "A":
placeHolder = placeHolder.Replace("A:<<Default>>", keys);
break;
case "B":
placeHolder = placeHolder.Replace("B:<<Default>>", keys);
break;
case "C":
placeHolder = placeHolder.Replace("C:<<Default>>", keys);
break;
case "D":
placeHolder = placeHolder.Replace("D:<<Default>>", keys);
break;
case "E":
placeHolder = placeHolder.Replace("D:<<Default>>", keys);
break;
}
}
formattedKeys.Add(placeHolder);
}
返回Checked.byte 3.1
但3
引发Checked.byte "3.1"
似乎很奇怪。
答案 0 :(得分:3)
float
中定义了float32
和FSharp.Core.Operators
个函数。
e.g。
let a = float 56
FSharp.Core.Operators.Checked
包含可以选择用于执行已检查的函数,而不是FSharp.Core.Operators
中定义的默认的,未经检查的算术。
FSharp.Core.Operators
,因此这些函数可自动使用,但您可以通过打开Checked
来隐藏其中一些具有替代检查实现的函数。使用检查算术时,溢出会引发异常。
float
和float32
没有检查FSharp.Core.Operators.Checked
中定义的替代方案,因为它们的行为没有改变,这些类型是IEEE标准化的,内置特殊值来表示正面和负面另一方面,积分类型没有特殊值,它们只是一个数字范围,所以当你超出范围时的行为可以用不同的方式处理。
例如,我们可以看到,如果我们查看F#核心源代码,那么对于float
,已检查和未检查的加法函数都会转换为IL op add
,同时转换整数加法根据所使用的算术类型,可以add.ovf
或add
。
请参阅:
我不知道任何内置的替代函数拒绝3.1
但接受3.0
。据推测,如果成功,您可以使用Option
撰写内容以返回Some byte
,否则返回None
。但请注意,浮点数并非所有整数值都可以完全表示,因此您必须决定如何处理它。