如果 floor() 的结果不能完全表示,您期望 d 的值是多少?当然,如果您在变量中得到浮点数的表示,那么根据定义,它是完全可表示的,不是吗?你已经得到 d...
(此外,Mehrdad 的回答对于 32 位整数是正确的。在具有 64 位双精度和 64 位整数的编译器中,您当然会遇到更多问题...)
编辑:也许您的意思是“floor() 的理论结果,即小于或等于参数的最大整数值,可能无法表示为 int”。这当然是真的。在 int 为 32 位的系统中显示这一点的简单方法:
int max = 0x7fffffff;
double number = max;
number += 10.0;
double f = floor(number);
int oops = (int) f;
当从浮点到整数的转换溢出时,我不记得 C 做了什么……但它会在这里发生。
编辑:还有其他有趣的情况需要考虑。下面是一些 C# 代码和结果 - 我想至少 类似 的事情会在 C 中发生。在 C# 中,double 被定义为 64 位,long 也是如此。
using System;
class Test
{
static void Main()
{
FloorSameInteger(long.MaxValue/2);
FloorSameInteger(long.MaxValue-2);
}
static void FloorSameInteger(long original)
{
double convertedToDouble = original;
double flooredToDouble = Math.Floor(convertedToDouble);
long flooredToLong = (long) flooredToDouble;
Console.WriteLine("Original value: {0}", original);
Console.WriteLine("Converted to double: {0}", convertedToDouble);
Console.WriteLine("Floored (as double): {0}", flooredToDouble);
Console.WriteLine("Converted back to long: {0}", flooredToLong);
Console.WriteLine();
}
}
结果:
原始值:4611686018427387903
转换为双:
4.61168601842739E+18
地板(双):4.61168601842739E+18
转换回长:
4611686018427387904
原值:9223372036854775805
转换为双:
9.22337203685478E+18
地板(双):9.22337203685478E+18
转换回长:
-9223372036854775808
换句话说:
(long) floor((double) original)
并不总是与original 相同。这应该不足为奇 - long 值比双精度值(给定 NaN 值)更多,并且大量双精度值不是整数,因此我们不能期望每个 long 都可以精确表示。但是,所有 32 位整数都可以表示为双精度数。