这是在我的电脑上所发生的:
(double)(float)0.6
= 0.60000002384185791
(double)0.6f
= 0.60000002384185791
(double)(6/10f)
= 0.6
(double)(float)(6/10f)
= 0.6
6/10f也是浮点数,为什么它可以精确地为0.6呢?
在我的想法中(double)(6/10f)应该也是0.60000002384185791。
有人能帮忙解释一下吗?谢谢!
这是在我的电脑上所发生的:
(double)(float)0.6
= 0.60000002384185791
(double)0.6f
= 0.60000002384185791
(double)(6/10f)
= 0.6
(double)(float)(6/10f)
= 0.6
6/10f也是浮点数,为什么它可以精确地为0.6呢?
在我的想法中(double)(6/10f)应该也是0.60000002384185791。
有人能帮忙解释一下吗?谢谢!
0.6
不能准确地表示为float
,但它可以准确地表示为double
(如果您不清楚为什么0.6
不能准确表示为浮点数,请尝试此链接了解浮点运算的不准确性)。Console.WriteLine
,因为我意识到编译器会为您选择一个重载,这会混淆情况。)// As written in source
var j = (double)(float)0.6;
var k = (double)0.6f;
var l = (double)(6/10f);
var m = (double)(float)(6/10f);
// Code as seen by Reflector
double j = 0.60000002384185791;
double k = 0.60000002384185791;
double l = 0.6;
double m = 0.6;
为什么编译器选择以这种特定的方式编译对我来说是无法理解的(顺便提一下,这全部都是在关闭优化的情况下完成的)。
还有一些有趣的情况:
// Code
var a = 0.6;
var b = (double)0.6;
var c = 0.6f;
var d = (float)0.6;
var e = 6 / 10;
var f = 6 / (10f);
var g = (float)(6 / 10);
var h = 6 / 10f;
var i = (double)6 / 10;
// Prints out 0.60000002384185791
double n = (float)0.6;
double o = f;
// As seen by Reflector
double a = 0.6;
double b = 0.6;
float c = 0.6f;
float d = 0.6f;
int e = 0;
float f = 0.6f;
float g = 0f;
float h = 0.6f;
double i = 0.6;
double n = 0.60000002384185791;
double o = f;
ToString()
不总是打印所有数字,Visual Studio调试器也不会。
0x3fe3333333333333
值更接近于0.6。 - paxdiablo