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

大家看看我是不是见鬼了???

  •  
  •   XiaoFaye · 2017-07-19 17:36:53 +08:00 · 5900 次点击
    这是一个创建于 2684 天前的主题,其中的信息可能已经有所发展或是发生改变。

    image

    24 条回复    2017-07-20 18:40:30 +08:00
    ss098
        1
    ss098  
       2017-07-19 17:38:22 +08:00
    你这是字符串之间的比较,而不是数字间的比较。
    BOYPT
        2
    BOYPT  
       2017-07-19 17:38:51 +08:00
    没毛病啊
    XiaoFaye
        3
    XiaoFaye  
    OP
       2017-07-19 17:42:14 +08:00
    好吧,还以为 toFixed 是返回保留两位小数的数字,是我错了。。。。

    PS:JS 直接对比浮点数会不会有坑呀?
    erichuang1994
        4
    erichuang1994  
       2017-07-19 17:42:53 +08:00
    字符串比较是比较字典序
    akrf
        5
    akrf  
       2017-07-19 17:43:19 +08:00 via Android
    js 就是鬼呀
    gino86
        6
    gino86  
       2017-07-19 17:48:02 +08:00
    浮点数一般都不建议用来进行比较,尤其是相等性
    SakuraKuma
        7
    SakuraKuma  
       2017-07-19 17:58:48 +08:00   ❤️ 1
    parseFloat 后相减<Number.EPSILON 用于比较浮点数就好了~
    autoxbc
        8
    autoxbc  
       2017-07-19 20:11:34 +08:00
    如果是自己玩,建议用显式转换,隐式转换坑比较多,一般人也做不到熟读规范;如果是业务代码,建议用 Math.js 库,js 处理数字有残疾。
    linhaiqi
        9
    linhaiqi  
       2017-07-19 20:13:07 +08:00
    呵呵。。。
    klesh
        10
    klesh  
       2017-07-19 20:36:44 +08:00 via Android
    @akrf
    @autoxbc
    说得好像
    klesh
        11
    klesh  
       2017-07-19 20:40:03 +08:00 via Android   ❤️ 1
    @klesh 说得好像其它语言原生类型就没问题一样。百度下浮点数吧,所有语言一个样都是不精确的。
    ech0x
        12
    ech0x  
       2017-07-19 21:22:57 +08:00 via iPad
    这其实是 IEEE 754 的锅,对于遵守 IEEE 754 标准实现浮点数的语言,直接比较浮点数大小都有坑,合理的解决方法正如 @SakuraKuma 所说的把两个浮点数相减与零比较大小。
    这里有个收集语言浮点数表现的网站:0.30000000000000004.com
    mingyun
        13
    mingyun  
       2017-07-20 00:21:51 +08:00
    神奇的 js
    Sparetire
        14
    Sparetire  
       2017-07-20 02:23:00 +08:00 via Android
    js 是比较挫但这里显然不是 js 的锅,和浮点数也没个半毛钱关系,令我惊讶的是竟然只有一楼一个说得最准确。。可能二楼也知道原因,"4">"1"没毛病
    zhpech
        15
    zhpech  
       2017-07-20 02:27:13 +08:00   ❤️ 1
    ……楼里说的都是什么鬼 这是字符串之间的比较,逐字字典序比较,另外无论是 "" 还是文档都可以看出这返回的是字符串,不要动不动就黑 JS C 语言也这么比……

    numObj.toFixed([digits])

    Returns: A string representation of numObj that does not use exponential notation and has exactly digits digits after the decimal place. The number is rounded if necessary, and the fractional part is padded with zeros if necessary so that it has the specified length. If numObj is greater than 1e+21, this method simply calls Number.prototype.toString() and returns a string in exponential notation.
    Perry
        16
    Perry  
       2017-07-20 02:43:27 +08:00
    双引号:妈蛋没人在乎我
    wbswjc
        17
    wbswjc  
       2017-07-20 03:11:53 +08:00
    这时候就体现 php 类型转换的人性化了 (<?php "1.1" < "2.2" == true; ?>, 我觉得要不就用强类型, 要不就把自动类型转换做得人性化一点, js 对搞不拎清的人不太友好, 坑很多, 虽然楼主说的这个应该不算坑- -
    cxbig
        18
    cxbig  
       2017-07-20 03:18:28 +08:00
    @wbswjc PHP 一样有 Epsilon 的坑
    http://php.net/manual/en/language.types.float.php

    无论是不是动态类型的参数,在涉及比较的时候最好还是转换一下,别偷懒。
    autoxbc
        19
    autoxbc  
       2017-07-20 03:30:41 +08:00
    @Sparetire
    @zhpech

    仔细读的话会发现,楼主在 3 楼已经表示弄懂了,不过又顺带提问浮点数是否有坑。

    所以本节点所有提到本题是字符串比较的,都是直接回答楼主的提问;所有提到浮点数问题的,都是回答楼主在 3 楼的提问,并没有谁看不出问题在哪。
    XiaoFaye
        20
    XiaoFaye  
    OP
       2017-07-20 05:09:25 +08:00
    @autoxbc
    @zhpech
    @ech0x
    @ss098
    @SakuraKuma 非常感谢大家的回复,由于本人主力不是 JS,难免会犯一些低级的错误,想当然地以为 toFixed 返回的是数字。
    Sirormy
        21
    Sirormy  
       2017-07-20 11:00:08 +08:00
    还真没注意过,Mozilla 的文档写的。

    “ A string representing the given number using fixed-point notation.”

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
    caniuse
        22
    caniuse  
       2017-07-20 12:32:51 +08:00
    toFixed() 方法使用定点表示法来格式化一个数。

    语法
    numObj.toFixed(digits)
    参数

    digits
    小数点后数字的个数;介于 0 到 20 (包括)之间,实现环境可能支持更大范围。如果忽略该参数,则默认为 0。
    返回值

    一个数值的字符串表现形式,不使用指数记数法,而是在小数点后有 digits 位数字。该数值在必要时进行四舍五入,另外在必要时会用 0 来填充小数部分,以便小数部分有指定的位数。 如果数值大于 1e+21,该方法会简单调用 Number.prototype.toString()并返回一个指数记数法格式的字符串。

    抛出异常

    RangeError
    如果 digits 参数太小或太大。0 到 20 (包括)之间的值不会引起 RangeError。实现环境( implementations )也可以支持更大或更小的值。
    TypeError
    如果该方法在一个非 Number 类型的对象上调用。
    示例
    var numObj = 12345.6789;

    numObj.toFixed(); // 返回 "12346":进行四舍五入,不包括小数部分
    numObj.toFixed(1); // 返回 "12345.7":进行四舍五入

    numObj.toFixed(6); // 返回 "12345.678900":用 0 填充

    (1.23e+20).toFixed(2); // 返回 "123000000000000000000.00"

    (1.23e-10).toFixed(2); // 返回 "0.00"

    2.34.toFixed(1); // 返回 "2.3"

    -2.34.toFixed(1); // 返回 -2.3 (由于操作符优先级,负数不会返回字符串)

    (-2.34).toFixed(1); // 返回 "-2.3" (若用括号提高优先级,则返回字符串)
    规范
    Specification Status Comment
    ECMAScript 3rd Edition (ECMA-262) Standard Initial definition. Implemented in JavaScript 1.5.
    ECMAScript 5.1 (ECMA-262)
    Number.prototype.toFixed Standard
    ECMAScript 2015 (6th Edition, ECMA-262)
    Number.prototype.toFixed Standard
    浏览器兼容性
    Desktop Mobile
    Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
    相关链接
    Number.prototype.toExponential()
    Number.prototype.toPrecision()
    Number.prototype.toString()
    AJian
        23
    AJian  
       2017-07-20 18:38:44 +08:00   ❤️ 1
    你可以,+a>+b
    AJian
        24
    AJian  
       2017-07-20 18:40:30 +08:00
    归根结底就是用的字符串做比较,字符串比较的是 ASCII 码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:50 · PVG 02:50 · LAX 10:50 · JFK 13:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.