-1.5为什么是double而不是float?

-1.5为什么是double而不是float?

“问题很好,但为什么不问问Google呢?”



这是开发Music99时遇到的问题。

笨鸟飞时的迷惑

为了自动化生成Note,需要提前传好变量的值,例如transform.postion.x。1号轨道是-1.5,2号轨道是0.5,etc。

在此遇到了个迷惑问题。直接定义float key1_x = -1.5,会报错如下。

double是比float精度更高的类型,但是-1.5从人类认知上是很小的数字,为什么就自动变成了double呢?

为了去除报错,把 = -1.5删掉,在外面配置了-1.5,这样就能正常运行了。

在Google上随便查了下“为什么负数是float”,出来的大部分都是“如何检测负数是不是float”,答非所问。继续搜索应该是可以找到答案的,但毕竟身边有大佬@jskyzero,把问题打包了下,写了篇小论文发送过去。

然后大佬果然给出了详细解答。


大佬的耐心回复

开幕雷击:“你知道打开浏览器 0.1+0.2不等于0.3吗?”

计算机里没有小数,只有浮点数,浮点数也只是近似值,无法达到准确值。

计算机科学中,浮点(英语:floating point,缩写为FP)是一种对于实数的近似值数值表现法,由一个有效数字(即**尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值,称为浮点数(floating-point number)。利用浮点进行运算,称为浮点计算**,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。

因为无法保证准确性,大部分游戏尤其是需要做数值校验的游戏,都会实现自己的无误差浮点数计算,以保证浮点数计算在各个平台架构下的结果一致性。

然后回到上面的问题:由于有误差,自动推导会自动使用精度更好的double类型。如果想使用float类型,需要显式声明为-1.5f,类似数值类型0XAA = 10,0X16进制。


作者

UyNad

发布于

2021-09-05

更新于

2024-08-07

许可协议

CC BY-NC-SA 4.0

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×