【发布时间】:2014-06-26 08:38:26
【问题描述】:
如何在 c# 中指定特定的 double 精度文字或值?
例如,我想在程序中使用小于 1 的最大 double 值的常量。小于一的最大double 是二进制的1.11111111 11111111 11111111 11111111 11111111 11111111 1111 x 2^(-1)。将其表示为十六进制的 big-endian double 将是 0x3fe f ffff ffff ffff
我可以使用以下代码生成它:
var largestDoubleLessThanOneBytes = new byte[] {0x3f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
if (BitConverter.IsLittleEndian) largestDoubleLessThanOneBytes = largestDoubleLessThanOneBytes.Reverse().ToArray();
double largestDoubleLessThanOne = BitConverter.ToDouble(largestDoubleLessThanOneBytes, 0);
BitConverter 不能用于 const 的声明中,因此不能用于代替文字值。
使用this tool,我可以得到文字9.99999999999999888977697537484E-1,它最终是完全相同的双精度数。 BitConverter.ToString(BitConverter.GetBytes(9.99999999999999888977697537484E-1)) == "FF-FF-FF-FF-FF-FF-EF-3F".
除了找到一个十进制文字,其最接近的双精度表示是您想要的双精度,还有其他方法可以将特定的double 值放入 c# 代码中吗?
【问题讨论】:
-
您还可以使用 c# 代码使用
.ToString("R")为双精度数吐出适当的十进制文字。在这种情况下,它将是0.99999999999999989。尝试在字符串格式中添加足够的小数位以输出足够精确的值以用作文字是行不通的,为什么请参阅stackoverflow.com/questions/1421520/… -
在 Java 中,我会使用 Math.nextAfter(1.0, Double.NEGATIVE_INFINITY)。这可能是 C# nextAfter 函数的情况吗?