【发布时间】:2020-06-24 15:12:08
【问题描述】:
这可能是一个非常简单的答案,但我无法弄清楚这种情况下的问题所在。 我想将 double 转换为 short(反之亦然),但这样做会得到不同的结果。
例如:
double test = 33768; test=33769
short valuetest = (short)test; valuetest = -31768
short test2 = -31768; test2 = -31768
double valuetest2 = (double) test2; valuetest2 = -31768
在我的用例中,valuetest2 的值应该是 33768,或者这就是我试图完成的任务。实现此结果的更好方法是什么?或者有人可以通过将第一个测试的值从 33769 转换为 -31768 来解释为什么?提前致谢!
【问题讨论】:
-
签名短裤可以存储从 -32768 到 +32767 的值。
-
鸽巢原理应该告诉您,不可能由 64 位双精度表示的每个唯一值都映射到唯一的 16 位短整数,更不用说往返返回原始值了。跨度>
-
Explicit Numeric Conversions 中记录了这一点:当您将 double 或 float 值转换为整数类型时,该值会向零舍入到最接近的整数值。如果生成的整数值超出目标类型的范围,则结果取决于溢出检查上下文。在已检查的上下文中,会引发 OverflowException,而在未检查的上下文中,结果是目标类型的未指定值。
-
为了避免这种混淆,您可以使用
checked,如接受的Best (safest) way to convert from double to int 答案所示——同样的答案适用于转换为short和int。事实上,我认为这可能是重复的,同意吗? Why casting big double value in sbyte returns 0 in C#? 和 Weird result from unchecked(), possible compiler bug? 也可能适用。