【发布时间】:2018-11-23 13:09:28
【问题描述】:
当尝试从 int 转换为 float 和向后转换时会发生奇怪的事情。
原始示例代码:
int val = 28218681; // val=28218681
float fVal = (float) val; // fVal=2.821868E+07
int val2 = (int) fVal; // val2=28218680
有人可以解释为什么转化会从价值中丢失最右边的“1”吗?
谢谢你 马吕斯
【问题讨论】:
-
我认为您可以在这里找到问题的答案,这是一种不同的语言,但适用的原则相同。 stackoverflow.com/questions/30260769/…
-
见 - docs.microsoft.com/en-us/dotnet/csharp/language-reference/… - 注意精度是 "~6-9 位" 这意味着不是所有的 8 位整数都可以准确地表示为浮点数。
-
A
float和int都使用 32 位。但是,int可以使用所有这些位来表示其符号和值,而float使用其中一些位来表示浮点和尾数,这意味着它不能表示相同范围的整数值 - 所以它失去了一些精度。 -
不是答案,但如果你想要精确的分数,请使用小数而不是浮点数。
-
float 类型有 24 位可用于表示一个值,int 有 31 位。如此大的值无法拟合,必须四舍五入。第一次你会输一点是在 2^24+1 = 16777217,试试看。使用 double 来获得领先,它可以存储 53 位。或十进制,96 位,相当于 28 位十进制数字。
标签: c#