浮动无效转换/浮动意外行为

时间:2018-11-22 10:55:37

标签: c# floating-point

我正想着想一下浮动行为(在C#中)。我注意到floating point precision issue的问题。 我想将浮点字符串转换为浮点,向其添加+1并将其转换回字符串。输入可以带(不超过5个小数位)或不带小数,每次都不同。输出必须再次为完整符号(没有科学符号,如:2.017002E + 09F)

在十进制转换中似乎可以正常使用。

有没有关于最佳实践的建议,

var inputDecimalStr = "2017002005"; //2017002005.55 has the same result for the float conversion
float floatRegNr = 0;
float.TryParse(inputDecimalStr, out floatRegNr); // somehow this converts to 2.017002E+09
decimal test1 = decimal.Parse(inputDecimalStr); // this seems to work
float test2 = Convert.ToSingle(test1); // somehow this converts to 2.017002E+09
float test3 = Single.Parse(inputDecimalStr, NumberStyles.Float, CultureInfo.InvariantCulture);
float test4 = 2017002005F;
float test5 = 2.017002E+09F;
float test6 = 2.017002005E+09F;
double test7 = 234423.33D;

//this works ok
test5.ToString("0." + new string('#', 339));
test1.ToString();

1 2

1 个答案:

答案 0 :(得分:2)

如果您使用this tool that shows you the binary representation of float,则会得到2017002005表示为0x4ef07204,将其转换回十进制形式将变为2017001984(转换后的错误为21) )。

如果更改数字的最低有效位(即可以记录的最小更改),则会得到0x4ef07205,代表2017002112(比2017002005 + 1多107。

如果这一详细程度很重要,则可以使用定点算法。由于只想加1,所以将数字分为整数和小数部分,将1加到整数部分,然后分别将每个部分转换回String。