• 请不要在回答技术问题时复制粘贴 AI 生成的内容
XiaoFaye
V2EX  ›  程序员

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

  •  
  •   XiaoFaye · Jul 19, 2017 · 6985 views
    This topic created in 3401 days ago, the information mentioned may be changed or developed.

    image

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

    PS:JS 直接对比浮点数会不会有坑呀?
    erichuang1994
    erichuang1994
    Jul 19, 2017
    4
    字符串比较是比较字典序
    akrf
    akrf
    Jul 19, 2017 via Android
    5
    js 就是鬼呀
    gino86
    gino86
    Jul 19, 2017
    6
    浮点数一般都不建议用来进行比较,尤其是相等性
    SakuraKuma
    SakuraKuma
    Jul 19, 2017❤️1
    7
    parseFloat 后相减<Number.EPSILON 用于比较浮点数就好了~
    autoxbc
    autoxbc
    Jul 19, 2017
    8
    如果是自己玩,建议用显式转换,隐式转换坑比较多,一般人也做不到熟读规范;如果是业务代码,建议用 Math.js 库,js 处理数字有残疾。
    linhaiqi
    linhaiqi
    Jul 19, 2017
    9
    呵呵。。。
    klesh
    klesh
    Jul 19, 2017 via Android
    10
    @akrf
    @autoxbc
    说得好像
    klesh
    klesh
    Jul 19, 2017 via Android❤️1
    11
    @klesh 说得好像其它语言原生类型就没问题一样。百度下浮点数吧,所有语言一个样都是不精确的。
    ech0x
    ech0x
    Jul 19, 2017 via iPad
    12
    这其实是 IEEE 754 的锅,对于遵守 IEEE 754 标准实现浮点数的语言,直接比较浮点数大小都有坑,合理的解决方法正如 @SakuraKuma 所说的把两个浮点数相减与零比较大小。
    这里有个收集语言浮点数表现的网站:0.30000000000000004.com
    mingyun
    mingyun
    Jul 20, 2017
    13
    神奇的 js
    Sparetire
    Sparetire
    Jul 20, 2017 via Android
    14
    js 是比较挫但这里显然不是 js 的锅,和浮点数也没个半毛钱关系,令我惊讶的是竟然只有一楼一个说得最准确。。可能二楼也知道原因,"4">"1"没毛病
    zhpech
    zhpech
    Jul 20, 2017❤️1
    15
    ……楼里说的都是什么鬼 这是字符串之间的比较,逐字字典序比较,另外无论是 "" 还是文档都可以看出这返回的是字符串,不要动不动就黑 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
    Perry
    Jul 20, 2017
    16
    双引号:妈蛋没人在乎我
    wbswjc
    wbswjc
    Jul 20, 2017
    17
    这时候就体现 php 类型转换的人性化了 (<?php "1.1" < "2.2" == true; ?>, 我觉得要不就用强类型, 要不就把自动类型转换做得人性化一点, js 对搞不拎清的人不太友好, 坑很多, 虽然楼主说的这个应该不算坑- -
    cxbig
    cxbig
    Jul 20, 2017
    18
    @wbswjc PHP 一样有 Epsilon 的坑
    http://php.net/manual/en/language.types.float.php

    无论是不是动态类型的参数,在涉及比较的时候最好还是转换一下,别偷懒。
    autoxbc
    autoxbc
    Jul 20, 2017
    19
    @Sparetire
    @zhpech

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

    所以本节点所有提到本题是字符串比较的,都是直接回答楼主的提问;所有提到浮点数问题的,都是回答楼主在 3 楼的提问,并没有谁看不出问题在哪。
    XiaoFaye
    XiaoFaye
    OP
    Jul 20, 2017
    20
    @autoxbc
    @zhpech
    @ech0x
    @ss098
    @SakuraKuma 非常感谢大家的回复,由于本人主力不是 JS,难免会犯一些低级的错误,想当然地以为 toFixed 返回的是数字。
    Sirormy
    Sirormy
    Jul 20, 2017
    21
    还真没注意过,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
    caniuse
    Jul 20, 2017
    22
    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
    AJian
    Jul 20, 2017❤️1
    23
    你可以,+a>+b
    AJian
    AJian
    Jul 20, 2017
    24
    归根结底就是用的字符串做比较,字符串比较的是 ASCII 码
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2973 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 10:21 · PVG 18:21 · LAX 02:21 · JFK 05:21
    ♥ Do have faith in what you're doing.