楼主使用了多年,也一直没搞明白为什么要加 0,再网上搜了一下,也讲的不清不楚的,有没有大神简单通俗的说一下?
为什么设计的时候,不直接给转化成 double 呢?
1
EarthChild 2020-11-10 20:37:20 +08:00
|
2
cmdOptionKana 2020-11-10 20:37:33 +08:00
这个知识点叫做 “字面量” (英文是 literal )
|
3
ManjusakaL 2020-11-10 20:39:04 +08:00 1
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" 前面几条都是有效答案。。 |
4
jim9606 2020-11-10 20:40:58 +08:00
大部分编程语言中,没有小数点的字面量默认为 integer,然后这里前面的除号就会被理解为整除。有小数点的默认为 double 。
在 Java 和 C 中你可以用 0.0d ,0.0f 来显式表明浮点数。 |
5
thefack 2020-11-10 20:49:54 +08:00
因为整数相除得到的还是整数,小数部分会被丢弃,而将其中一个数转为小数就可以避免这个问题
|
6
nguoidiqua 2020-11-10 21:27:31 +08:00 1
如果不加,那就是两个整数相除,不能整除的部分就丢了,那这个时候你前面给他转成 double 有什么意义,小数位都丢了,再转成 double 也来不及了,只是小数点后面加个零而已。
当然,也可以不在后面加 .o,可以在前面 (double)。 至于为什么不直接整数相除就得到浮点数,因为那样设计的话,那取整的时候会麻烦些,麻烦不会消失只会转移,而且我估计会有更多人问和你相反的问题。 |
7
BrettD 2020-11-10 21:33:46 +08:00 via iPhone
不加.0 就是整数类型
|
8
fansangg 2020-11-10 21:51:19 +08:00
用来区分而已
|
9
Cbdy 2020-11-10 22:29:26 +08:00 via Android
子面值的类型
|
10
mepwang 2020-11-10 22:35:47 +08:00 via iPhone
可以不加 0,保留小数点也行?
|
11
user8341 2020-11-10 23:10:31 +08:00
只要打印一下
1 / 5 1 / 5.0 对比一下两者的结果。没有 .0 的是整形,除了还是整形。在你的例子就是除了还是 long 型。 |
12
dingwen07 2020-11-10 23:52:42 +08:00 via Android
看一下 Java 优先级
你前面是整形,后面不写.0 也默认是整数,Java 一做除法就成了整数除法,小数部分直接没了 |
13
realpg 2020-11-10 23:57:35 +08:00 8
用了这么多年 java 还不明白浮点的基本操作
真可怕 |
14
Jooooooooo 2020-11-11 00:09:29 +08:00
?
写一个 100, 结果程序自动转成 double 了, 你感觉合理吗? |
15
MineDog 2020-11-11 01:24:27 +08:00 1
报错是因为 10000000000 超过 int 最大值了,后缀添加 L 声明成 long 可以避免,但是这样 long/long 结果是 long,所以可以加一个后缀 D 来声明成 double
|
16
nvkou 2020-11-11 02:32:37 +08:00
long 1L
int 1 double 1.0 or 1d |
17
Building 2020-11-11 07:16:35 +08:00 via iPhone
稍微看一下任何强类型语言的语法都不会有这样的疑问吧...
|
18
annielong 2020-11-11 09:21:04 +08:00
框架用多了,基本知识都忘了,刚单独增了一个接口,php 组给了 4K 的一个源文件,java 组给了 60M 的源文件和 800M 的组件包
|
21
vincent7245 2020-11-11 10:41:30 +08:00 1
不懂就问:不是应该写成 1000000d 吗,刚毕业的时候我也写过 1000000.0,review 代码的时候被架构师疯狂吐槽
|
22
GM 2020-11-11 10:45:41 +08:00 1
报错了连错误信息都不看一眼的吗?真可怕........
说实话,我最恶心的事情之一,就是同事碰到问题了,连错误信息都不看一眼就在那里嚷嚷“错了,过来帮我看一下”,等你过去一看,哦,file not found:/var/www/site/config/app.conf,tmd 连路径都给你指出来了还在那里瞎 jb 嚷嚷“好奇怪啊昨天还能用的”。 |
23
kuro1 2020-11-11 10:50:57 +08:00 1
同意楼上,报错信息都不看真的离谱
|
24
DoodleSit 2020-11-11 10:54:03 +08:00
long 转 double 肯定呀
|
25
newmlp 2020-11-11 10:56:20 +08:00
整数除整数结果是整数,这也要发个贴?
|
26
qiayue 2020-11-11 11:08:35 +08:00 1
我们后台对于单 IP 连续输错多次密码,会屏蔽 IP 几百秒,然后办公室里同 IP 的其他同事就遭殃了, 访问后台提示:
Suspicious activity has occured on your IP address and you have been denied access for another [882] second(s). 然后同事就喊,后台崩了,后台崩了,快修复,根本不看英文 |
27
lakehylia 2020-11-11 11:34:20 +08:00
@vincent7245 要是我就写 100.0d ,堵死架构师。
|
29
lakehylia 2020-11-11 11:40:51 +08:00 1
若参与运算的成员类型不同,则先转换成同一类型,然后进行运算
转换按数据长度增加的方向进行,以保证精度不降低。如 int 型和 long 型运算时,先把 int 量转成 long 型后再进行运算 所有的浮点运算都是以双精度进行的,即使是两个 float 单精度量运算的表达式,也要先转换成 double 型,再作运算 char 型和 short 型参与运算时,必须先转换成 int 型 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。 |
30
msg7086 2020-11-13 01:39:09 +08:00
@vincent7245 都可以的。写.0 更直观一些,一眼就知道是浮点立即量。d 还要大脑里转一圈。
|