不懂就问,为什么 double 后面一定要加上一个 0?

2020-11-10 20:32:26 +08:00
 GTD

楼主使用了多年,也一直没搞明白为什么要加 0,再网上搜了一下,也讲的不清不楚的,有没有大神简单通俗的说一下?

为什么设计的时候,不直接给转化成 double 呢?

4991 次点击
所在节点    Java
30 条回复
EarthChild
2020-11-10 20:37:20 +08:00
八成还是自动类型转换。可能右边的以为自己是个 Int 型~ 你也不说报啥错。渣男!
cmdOptionKana
2020-11-10 20:37:33 +08:00
这个知识点叫做 “字面量” (英文是 literal )
ManjusakaL
2020-11-10 20:39:04 +08:00
Java 的一个语言特性而已

> If an integer operator other than a shift operator has at least one operand of type long, then the operation is carried out using 64-bit precision, and the result of the numerical operator is of type long. If the other operand is not long, it is first widened (§5.1.5) to type long by numeric promotion (§5.6).

> Otherwise, the operation is carried out using 32-bit precision, and the result of the numerical operator is of type int. If either operand is not an int, it is first widened to type int by numeric promotion.

所以显示声明 是 long/(float|double),换句话说等价于 double period = (end - start)/(double) 1000000;

参见 https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.2

这种问题,Google 搜一下因为英文关键词, "java division of integers" 前面几条都是有效答案。。
jim9606
2020-11-10 20:40:58 +08:00
大部分编程语言中,没有小数点的字面量默认为 integer,然后这里前面的除号就会被理解为整除。有小数点的默认为 double 。
在 Java 和 C 中你可以用 0.0d ,0.0f 来显式表明浮点数。
thefack
2020-11-10 20:49:54 +08:00
因为整数相除得到的还是整数,小数部分会被丢弃,而将其中一个数转为小数就可以避免这个问题
nguoidiqua
2020-11-10 21:27:31 +08:00
如果不加,那就是两个整数相除,不能整除的部分就丢了,那这个时候你前面给他转成 double 有什么意义,小数位都丢了,再转成 double 也来不及了,只是小数点后面加个零而已。

当然,也可以不在后面加 .o,可以在前面 (double)。

至于为什么不直接整数相除就得到浮点数,因为那样设计的话,那取整的时候会麻烦些,麻烦不会消失只会转移,而且我估计会有更多人问和你相反的问题。
BrettD
2020-11-10 21:33:46 +08:00
不加.0 就是整数类型
fansangg
2020-11-10 21:51:19 +08:00
用来区分而已
Cbdy
2020-11-10 22:29:26 +08:00
子面值的类型
mepwang
2020-11-10 22:35:47 +08:00
可以不加 0,保留小数点也行?
user8341
2020-11-10 23:10:31 +08:00
只要打印一下
1 / 5
1 / 5.0

对比一下两者的结果。没有 .0 的是整形,除了还是整形。在你的例子就是除了还是 long 型。
dingwen07
2020-11-10 23:52:42 +08:00
看一下 Java 优先级
你前面是整形,后面不写.0 也默认是整数,Java 一做除法就成了整数除法,小数部分直接没了
realpg
2020-11-10 23:57:35 +08:00
用了这么多年 java 还不明白浮点的基本操作
真可怕
Jooooooooo
2020-11-11 00:09:29 +08:00
?

写一个 100, 结果程序自动转成 double 了, 你感觉合理吗?
MineDog
2020-11-11 01:24:27 +08:00
报错是因为 10000000000 超过 int 最大值了,后缀添加 L 声明成 long 可以避免,但是这样 long/long 结果是 long,所以可以加一个后缀 D 来声明成 double
nvkou
2020-11-11 02:32:37 +08:00
long 1L
int 1
double 1.0 or 1d
Building
2020-11-11 07:16:35 +08:00
稍微看一下任何强类型语言的语法都不会有这样的疑问吧...
annielong
2020-11-11 09:21:04 +08:00
框架用多了,基本知识都忘了,刚单独增了一个接口,php 组给了 4K 的一个源文件,java 组给了 60M 的源文件和 800M 的组件包
no1xsyzy
2020-11-11 09:31:36 +08:00
@Building
Python3:我是强类型,我 1/2 是 0.5
C:我是弱类型,我 1/2 是 0
vexjoe
2020-11-11 09:33:46 +08:00
@annielong php 果然是世界上最好的语言

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/723724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX