V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GTD
V2EX  ›  Java

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

  •  
  •   GTD · 2020-11-10 20:32:26 +08:00 · 5139 次点击
    这是一个创建于 1477 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    30 条回复    2020-11-13 01:39:09 +08:00
    EarthChild
        1
    EarthChild  
       2020-11-10 20:37:20 +08:00
    八成还是自动类型转换。可能右边的以为自己是个 Int 型~ 你也不说报啥错。渣男!
    cmdOptionKana
        2
    cmdOptionKana  
       2020-11-10 20:37:33 +08:00
    这个知识点叫做 “字面量” (英文是 literal )
    ManjusakaL
        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" 前面几条都是有效答案。。
    jim9606
        4
    jim9606  
       2020-11-10 20:40:58 +08:00
    大部分编程语言中,没有小数点的字面量默认为 integer,然后这里前面的除号就会被理解为整除。有小数点的默认为 double 。
    在 Java 和 C 中你可以用 0.0d ,0.0f 来显式表明浮点数。
    thefack
        5
    thefack  
       2020-11-10 20:49:54 +08:00
    因为整数相除得到的还是整数,小数部分会被丢弃,而将其中一个数转为小数就可以避免这个问题
    nguoidiqua
        6
    nguoidiqua  
       2020-11-10 21:27:31 +08:00   ❤️ 1
    如果不加,那就是两个整数相除,不能整除的部分就丢了,那这个时候你前面给他转成 double 有什么意义,小数位都丢了,再转成 double 也来不及了,只是小数点后面加个零而已。

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

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

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

    写一个 100, 结果程序自动转成 double 了, 你感觉合理吗?
    MineDog
        15
    MineDog  
       2020-11-11 01:24:27 +08:00   ❤️ 1
    报错是因为 10000000000 超过 int 最大值了,后缀添加 L 声明成 long 可以避免,但是这样 long/long 结果是 long,所以可以加一个后缀 D 来声明成 double
    nvkou
        16
    nvkou  
       2020-11-11 02:32:37 +08:00
    long 1L
    int 1
    double 1.0 or 1d
    Building
        17
    Building  
       2020-11-11 07:16:35 +08:00 via iPhone
    稍微看一下任何强类型语言的语法都不会有这样的疑问吧...
    annielong
        18
    annielong  
       2020-11-11 09:21:04 +08:00
    框架用多了,基本知识都忘了,刚单独增了一个接口,php 组给了 4K 的一个源文件,java 组给了 60M 的源文件和 800M 的组件包
    no1xsyzy
        19
    no1xsyzy  
       2020-11-11 09:31:36 +08:00
    @Building
    Python3:我是强类型,我 1/2 是 0.5
    C:我是弱类型,我 1/2 是 0
    vexjoe
        20
    vexjoe  
       2020-11-11 09:33:46 +08:00
    @annielong php 果然是世界上最好的语言
    vincent7245
        21
    vincent7245  
       2020-11-11 10:41:30 +08:00   ❤️ 1
    不懂就问:不是应该写成 1000000d 吗,刚毕业的时候我也写过 1000000.0,review 代码的时候被架构师疯狂吐槽
    GM
        22
    GM  
       2020-11-11 10:45:41 +08:00   ❤️ 1
    报错了连错误信息都不看一眼的吗?真可怕........

    说实话,我最恶心的事情之一,就是同事碰到问题了,连错误信息都不看一眼就在那里嚷嚷“错了,过来帮我看一下”,等你过去一看,哦,file not found:/var/www/site/config/app.conf,tmd 连路径都给你指出来了还在那里瞎 jb 嚷嚷“好奇怪啊昨天还能用的”。
    kuro1
        23
    kuro1  
       2020-11-11 10:50:57 +08:00   ❤️ 1
    同意楼上,报错信息都不看真的离谱
    DoodleSit
        24
    DoodleSit  
       2020-11-11 10:54:03 +08:00
    long 转 double 肯定呀
    newmlp
        25
    newmlp  
       2020-11-11 10:56:20 +08:00
    整数除整数结果是整数,这也要发个贴?
    qiayue
        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).

    然后同事就喊,后台崩了,后台崩了,快修复,根本不看英文
    lakehylia
        27
    lakehylia  
       2020-11-11 11:34:20 +08:00
    @vincent7245 要是我就写 100.0d ,堵死架构师。
    GM
        28
    GM  
       2020-11-11 11:36:16 +08:00
    @qiayue 别问,问就是“出错了不都是直接点确定关闭窗口的吗?难道真的有人去看上面的字?”
    lakehylia
        29
    lakehylia  
       2020-11-11 11:40:51 +08:00   ❤️ 1
    若参与运算的成员类型不同,则先转换成同一类型,然后进行运算
    转换按数据长度增加的方向进行,以保证精度不降低。如 int 型和 long 型运算时,先把 int 量转成 long 型后再进行运算
    所有的浮点运算都是以双精度进行的,即使是两个 float 单精度量运算的表达式,也要先转换成 double 型,再作运算
    char 型和 short 型参与运算时,必须先转换成 int 型
    在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。
    msg7086
        30
    msg7086  
       2020-11-13 01:39:09 +08:00
    @vincent7245 都可以的。写.0 更直观一些,一眼就知道是浮点立即量。d 还要大脑里转一圈。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5517 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:00 · PVG 17:00 · LAX 01:00 · JFK 04:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.