【问题标题】:How to get a fraction from a float number?如何从浮点数中获取分数?
【发布时间】:2011-06-07 17:22:02
【问题描述】:

我有一个浮点数:

var f = 0.1457;

或者:

var f = 4.7005

如何将小数余数作为整数?

即在我想得到的第一个例子中:

var remainder = 1457;

在第二个例子中:

var remainder = 7005;

【问题讨论】:

  • 您的问题没有明确定义。对于 fp 数,小数点后的位数取决于您的显示方式(实际表示不是以 10 为底,因此必须四舍五入才能以 10 为底显示)。
  • 你打算如何显示var f = 0.0145;1450145?
  • 出于兴趣,您希望在 0.123456 和 0.1 的情况下显示什么?
  • 你打算如何处理这个结果?你想让1.1564791564792.1212 吗?这纯粹是为了展示目的吗?在这种情况下,您可能不想在数学上处理这个问题。在示例中,我给出的第一个 dp 的重要性相差 100000。或者你会一直工作到 4dp?
  • @Richard,请考虑将第二个答案标记为正确,因为它更好。 ;-)

标签: javascript jquery


【解决方案1】:
function frac(f) {
    return f % 1;
}

希望有帮助 ;-)

【讨论】:

  • 这真的很酷,但它是如何工作的?你能解释一下吗?
  • @avi,%modulo operation,任何数字除以一的余数就是该数字的小数部分。
  • 想知道这是否被投票 - 它不可靠。 a = 34.5697; fracPart = a % 1;警报(fracPart); // 0.5696999999999974
  • 我不明白为什么这个答案被赞成。它不返回请求的结果,“作为整数的小数余数”。例如。对于 4.7005,它返回 0.7005 而不是 7005。这个答案是一个好的开始,但还不正确。
  • @LarsH -- 人们从谷歌登陆这个页面,寻找在 JS 中获取数字的小数部分。在这种情况下,问题的细节在很大程度上是无关紧要的。
【解决方案2】:

虽然这不是大多数人想要的,但 TS 要求将分数作为整数,但它是:

function fract(n){ return Number(String(n).split('.')[1] || 0); }
fract(1.23) // = 23
fract(123) // = 0
fract(0.0008) // = 8

【讨论】:

    【解决方案3】:

    这样就可以了(最多 4 位数字,如果您想要更小或更大的数字,请将倍数 (10000) 更改为更大或更小):

    Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000)
    

    【讨论】:

    • 0.0000 会返回什么?
    • @Richard Knop:应该给出 0。f 将小于 1.0,所以它只需要 f 并乘以 10000,这当然是 0。据我所见,它与codenoob 的答案,但更难阅读。 :)
    • 虽然这个解决方案是 TS 想要的,但这不是他在主题中所要求的,显然也不是其他来这里的人想要的。
    • 当f = 34.56时,这将返回5601。如果乘数为1000,则为561; 100 返回 57。
    • f % Math.floor(f)f % 1 相同,但后者也适用于负数
    【解决方案4】:

    parseInt(parseFloat(amount).toString().split('.')[1], 10)

    【讨论】:

    • 它返回 NaN 整数,而不是 0。
    【解决方案5】:

    你可以减去数字的下限,只得到小数部分,然后乘以 10000,即:

    var remainder = (f-Math.floor(f))*10000;
    

    【讨论】:

    【解决方案6】:

    我认为,假设我们想要向用户显示这些值,将这些数字视为字符串将是最好的方法。这解决了诸如 0.002 之类的小数值问题。

    我在尝试用上标的美分显示价格时遇到了这个问题。

    let price = 23.43; // 23.43
    let strPrice = price.toFixed(2) + ''; // "23.43"
    let integer = strPrice.split(".")[0] // "23"
    let fractional = strPrice.split(".")[1] // "43"
    

    【讨论】:

      【解决方案7】:

      这也取决于您想对剩余部分做什么(正如评论者已经询问的那样)。例如,如果基数是 1.03,你想要返回的余数是 3 还是 03——我的意思是,你想要它作为一个数字还是一个字符串(为了向用户显示它)。一个示例是文章价格显示,您不想将 03 转换为 3(例如 1.03 美元),而您希望将 03 上标。

      接下来,问题在于浮点精度。考虑一下:

      var price = 1.03;
      var frac = (price - Math.floor(price))*100;
      // frac = 3.0000000000000027
      

      因此,在这种情况下,您可以通过在没有乘法(和可选的零填充)的情况下对字符串表示进行切片来“解决”这个问题。同时,您避免了浮动精度问题。在this jsfiddle 中也有演示。

      This post 关于浮点精度可能会有所帮助以及this one

      【讨论】:

      • 这是一个很好的答案,因为我真的很想得到小数部分(即 0.xxx)
      【解决方案8】:
      var strNumber = f.toString();
      var remainder = strNumber.substr(strNumber.indexOf('.') + 1, 4);
      remainder = Number(reminder);
      

      【讨论】:

        【解决方案9】:

        @Udara Seneviratne

        const findFraction = (num) => {
        
          return parseInt( // 5.---------------- And finally we parses a "string" type and returns an integer
            
            // 1. We convert our parameter "num" to the "string" type (to work as with an array in the next step)
            // result: "1.012312"
            num.toString() 
        
            // 2. Here we separating the string as an array using the separator: " . "
            // result: ["1", "012312"]
            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
            .split('.')
        
            // 3. With help a method "Array.splice" we cut the first element of our array
            // result: ["012312"]
            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
            .splice(1.1)
        
            // 4. With help a method "Array.shift" we remove the first element from an array and returns that
            // result: 012312 (But it's still the "string" type)
            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift
            .shift()       
        
          )
        }
        
        // Try it
        console.log("Result is = " + findFraction (1.012312))
        // Type of result
        console.log("Type of result = " + typeof findFraction (1.012312))
        // Some later operation
        console.log("Result + some number is = " + findFraction (1.012312) + 555)

        【讨论】:

        • 欢迎来到 StackOverflow。你的意思是.splice(1, 1)(逗号而不是点)和(findFraction (1.012312) + 555)(这个表达式周围的括号,以便添加而不是附加)?
        • 谢谢!如果我理解正确的话: 至于 .splice (1, 1) - 这只是 Array.splice (arg1, arg2, arg3) 方法的语法。逗号只是参数之间的分隔符。我们在 index-1 处裁剪一个元素。这将删除 ["1", "012312"] 中的 "1"。至于 (findFraction (1.012312) + 555)——我的错误。它可以在没有 console.log 的情况下工作,但是在 console.log 中需要将字符串转换为 Number 类型的运算符,它将像这样工作:console.log("Result + some number is = " + Number(findFraction (1.012312) + 555 )) 没有 console.log :prnt.sc/uw2s9c
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多