如何解决为什么float.TryParse接受“ 1.000e-45”并将其四舍五入为1.401298E-45?
我尝试验证输入字符串是否为浮点型。为此,我传递了输入字符串,例如“ 1.000e-45”,它比c#float最小允许值(1.401298E-45)更接近0。我希望float.tryParse返回false。取而代之的是,它返回true并将解析后的数字四舍五入到最小浮点数(1.401298E-45)。如果字符串中的数字甚至更低,则float.TryParse()会四舍五入为0。
我想念什么吗?
我该怎么做才能验证这样的低数字不会被解释为浮点数?
var isFloat = float.TryParse("1.000e-45",NumberStyles.Float,CultureInfo.InvariantCulture,out var number);
更新:用户输入的内容必须为字符串中的浮点数。由于规格原因,不允许具有更高的精度。想象一下它是某种API,它给了我一个应该是浮点数的字符串。我必须验证它是否在浮动范围内。
更新2:这不是有关浮点精度的问题。我知道,由于二进制数和螳螂的大小,您无法达到100%的精度。如我在问题中所述,我知道浮点数最接近0的值。我只是没想到TryParse()在接近0时会像这样四舍五入。我希望它会失败。
更新3:,我希望这一点更加清楚。那是我必须遵循的规范。
- 输入是字符串。字符串代表一个数字。就像“ 3.45e12”
- 该数字不得超出“±3.4028235e + 38”的范围。
- 在磁针中的数字不允许小于“±1.401298e-45”。规范就是这么说的。也允许“ 0”,但不允许“ 1e-100”或“ 1e-46”之类的东西。
- 我想做的是验证用户输入(字符串)完全满足此规范。我不必将字符串数字转换为C#数字类型并进行计算。我只需要验证输入的字符串号,然后将字符串号发送到API。当字符串不符合规范时,此api会出现问题。
- 我尝试使用float.TryParse()进行此验证。它适用于最小/最大范围(.Net Framework)。但这似乎是错误的方法。对于比实际表示的值更接近于0的数字字符串,float.TryParse()始终返回true,并且会将结果四舍五入以使其适合float:将其舍入为0(例如对于“ 1e-46”)或四舍五入最高1.401298E-45(例如,对于“ 1e-45”。这在某种程度上是有意义的,因为当它无法处理“ 999999999999999.9”之类的值的精度时,它的作用相同,该值不超过最大值且不太接近到0。将其舍入到1e13。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。