Javascript parseFloat(number) - parseFloat(number2) 返回 int

Posted

技术标签:

【中文标题】Javascript parseFloat(number) - parseFloat(number2) 返回 int【英文标题】:Javascript parseFloat(number) - parseFloat(number2) returning int 【发布时间】:2014-03-11 13:32:05 【问题描述】:

很抱歉,我需要帮助:(

我尝试将字符串转换为十进制,它可以工作,但我有一些问题:

    number = document.getElementById("totalcost").innerhtml;    //It is a string, but I am sure that it is a decimal
    number2 = prodCost;  //it is a string but in fact it is a decimal too
    alert(parseFloat(number)); // prints good (if number is 88,9 it will print 88,9)
    alert(parseFloat(number2)); // it's ok too

    alert(parseFloat(number) - parseFloat(number2)); // this is not ok :(
    //if number=88,9 and number2=17,77 I get 71 but i need 71,13

哦,伙计们,我很抱歉,我很傻。太感谢了!我已经连续工作了 9 个小时。真的很抱歉,谢谢大家!

【问题讨论】:

你的号码里真的有,吗? javascript parseFloat in Different Cultures的可能重复 【参考方案1】:

这看起来像是一个语言环境问题:parseFloat 仅将句点识别为小数点;当它到达逗号时它会停止解析,只给你整数值。不幸的是,没有办法改变这种行为。您需要将数字字符串中的逗号替换为句点才能获得十进制数。

【讨论】:

这似乎与 OP 的观察相矛盾(暗示他实际上并未使用 , 作为小数分隔符): > alert(parseFloat(number)); // 打印好(如果数字是 88,9,它将打印 88,9) @Tibos - 我同意。不过,我怀疑 OP 实际上是在执行 alert(number) 而不是 alert(parseFloat(number)) 并且仅在需要减法时才使用 parseFloat 我很抱歉,我很傻。非常感谢! @user3406280 - 没有什么愚蠢的。在我看来,这是 JavaScript 的一个缺陷。 (有Intl 对象--参见ECMAScript Internationalization API--支持以区域设置敏感的方式格式化数字,但没有其他方式。)【参考方案2】:

如果您将使用点而不是逗号(例如:71.13 而不是 71,13)一切都会按预期工作

【讨论】:

【参考方案3】:

parseIntparseFloat 采用提供的字符串中的第一个有效数字。

, 无效

parseFloat("17,77".replace(",","")); //1777

如果逗号用作分隔符,应该可以解决问题。

或者如果逗号被用作小数点

parseFloat("17,77".replace(",",".")); //17.77

在 MDN here中有解释

如果 parseInt 在 指定的基数,它会忽略它以及所有后续字符和 返回解析到该点的整数值。 parseInt 截断 数字到整数值。允许前导和尾随空格。

【讨论】:

【参考方案4】:

您似乎需要使用这些标准来操作数字

小数点分隔符是“,”而不是“.”,例如 1,2345(一个点二三四五) 组分隔符是'.'而不是 ',' 像 1.000,1(一千个点)

您可以使用 numeric.js 来满足此需求。

尝试去http://numeraljs.com/打开chrome dev,然后尝试用这些示例代码自己玩

// declare fr lang
numeral.language('fr', 
    delimiters: 
        thousands: ' ',
        decimal: ','
    ,
    abbreviations: 
        thousand: 'k',
        million: 'm',
        billion: 'b',
        trillion: 't'
    ,
    ordinal : function (number) 
        return number === 1 ? 'er' : 'ème';
    ,
    currency: 
        symbol: '€'
    
);

numeral.language('fr'); // set fr lang

number = '88,9';
number2 = '17,77';

numberRaw = numeral().unformat(number); // convert string to number
numberRaw2 = numeral().unformat(number2); // convert string to number

resultRaw = numberRaw - numberRaw2; // calculate result

resultStr = numeral(resultRaw).format('0,0.00'); // format to string

console.log(resultStr); // print 71,13

【讨论】:

以上是关于Javascript parseFloat(number) - parseFloat(number2) 返回 int的主要内容,如果未能解决你的问题,请参考以下文章

Javascript parseFloat(number) - parseFloat(number2) 返回 int

JavaScript - parseFloat 强制 2 位小数作为 NUMBER

哪个javascript函数像parsefloat一样将语言环境作为参数?

JavaScript ParseFloat重新植入,显示小数限制

Javascript数值转换(Number,parseInt,parseFloat)

js浮点数运算出现误差解决方案