gpt4 book ai didi

c# - 将 Math.Round 结果转换为 float 是否安全?

转载 作者:行者123 更新时间:2023-11-30 18:17:04 28 4
gpt4 key购买 nike

一位同事按照这些思路编写了一些代码:

var roundedNumber = (float) Math.Round(someFloat, 2);
Console.WriteLine(roundedNumber);

我不确定这段代码 - 此处写入的数字是否保证再保留 2 位小数?在我看来,将双 Math.Round(someFloat, 2) 截断为 float 可能会导致其字符串表示形式超过 2 位的数字似乎是合理的。任何人都可以提供一个这样的例子(证明这样的转换是不安全的)或者以某种方式证明执行这样的转换是安全的吗?

最佳答案

假设单精度和 double IEEE754 表示和规则,我已经检查了前 2^24 个整数 i那个

float(double( i/100 )) = float(i/100)

换句话说,将一个2位小数的小数转换两次(先是最接近的double,然后是最接近的单精度float)和直接把小数转换成单精度是一样的,只要把整数部分小数点不会太大。

我无法保证更大的值。

二次逼近和一次逼近是不同的,但这不是真正的问题。

至少转换两次是无害的 167772.16 ,就好像 Math.Round 会直接以单精度完成它一样。

这是带有 ArbitraryPrecisionFloat 包的 Squeak/Pharo Smalltalk 中的测试代码(很抱歉没有在 c# 中展示它,但语言并不重要,只有 IEEE 规则才重要)。

(1 to: 1<<24)
detect: [:i |
(i/100.0 asArbitraryPrecisionFloatNumBits: 24) ~= (i/100 asArbitraryPrecisionFloatNumBits: 24) ]
ifNone: [nil].

编辑

以上测试是多余的,因为感谢 Mark Dickinson (Innocuous double rounding of basic arithmetic operations) 提供的出色引用,我们知道做 float(double(x) / double(y))x / y 生成正确舍入的值,只要xy都可以表示为 float ,任何 0 <= x <= 2^24 都是这种情况和 y=100 .

编辑

我检查了最多 2^30(十进制值 > 1000 万)的分子,转换两次仍然与转换一次相同。在全局变暖的情况下,使用解释性语言走得更远不是一件好事......

关于c# - 将 Math.Round 结果转换为 float 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45061797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com