将数字截断到两位小数而不四舍五入


194

假设我的值为15.7784514,我想不进行四舍五入地显示为15.77。

var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));

结果是 -

15.8
15.78
15.778
15.7784514000 

如何显示15.77?


3
我很想问,为什么你不想四舍五入?无论在哪里,这似乎都是不正确的……
Camilo Martin

38
在显示货币时很有用。
Richard Ye

@ mik01aj-在显示货币时,更常见的是截断计算值,而不是四舍五入。例如,在美国,大多数税收形式都将截短而不是四舍五入的分数。在这种情况下,截断的值是正确的值。
史蒂文·拜克斯

4
@CamiloMartin在14.9亿美元和10亿美元的债务之间存在巨大差异。
Broda Noel

3
在14.9亿美元和15.0亿美元之间也存在巨大差异。那是一亿美元。
西甲联赛

Answers:


225

将数字转换为字符串,将数字匹配到小数点后第二位:

function calc(theform) {
    var num = theform.original.value, rounded = theform.rounded
    var with2Decimals = num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]
    rounded.value = with2Decimals
}
<form onsubmit="return calc(this)">
Original number: <input name="original" type="text" onkeyup="calc(form)" onchange="calc(form)" />
<br />"Rounded" number: <input name="rounded" type="text" placeholder="readonly" readonly>
</form>

toFixed方法在某些情况下(与)不同toString,因此会失败,因此请务必小心。


22
+1那应该解决舍入问题。我还是输出的结果上面使用toFixed,虽然如此:(Math.floor(value * 100) / 100).toFixed(2)。您可能知道,浮点值可能会产生奇怪的精度问题(在频谱的另一端,如果数字恰好是15,听起来就像OP想要的15.00)。
TJ Crowder 2010年

1
呵呵,或者如果您将两者结合使用:Number((15.7784514000*100).toString().match(/^\d+/)/100);
skobaljic

27
如果value = 4.27严重,则Math.floor(value * 100)/ 100无效,请尝试一下。
黑暗河马

3
@DarkHippo那就是因为4.27实际上是4.26999999999,所以Math.round通常是一个更好的解决方案,尽管不是原始问题的答案。实际上,给出的输出是字符串,应该使用字符串操作来代替所有浮点格式的数值解决方案。
BJury 2014年

3
...听起来不对。在任何情况下,在类型之间进行转换似乎都是绕行且不安全的。除非真正高级的程序员会说“所有类型都只是流”之类的东西。
JackHasaKeyboard

66

2016年11月5日更新

新答案,始终准确

function toFixed(num, fixed) {
    var re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?');
    return num.toString().match(re)[0];
}

由于javascript中的浮点数学运算总是会出现边缘情况,因此以前的解决方案在大多数情况下都是准确的,这还不够好。有这一些解决方案,如num.toPrecisionBigDecimal.jsaccounting.js。但是,我相信仅解析字符串将是最简单且始终准确的。

在@Gumbo接受的答案的基础上,以正确编写的正则表达式为基础进行更新,此新的toFixed函数将始终按预期运行。


旧答案,并不总是准确的。

滚动自己的toFixed函数:

function toFixed(num, fixed) {
    fixed = fixed || 0;
    fixed = Math.pow(10, fixed);
    return Math.floor(num * fixed) / fixed;
}

6
toFixed(
4.56,2

2
因此,这些答案中有许多在Math.floor()函数内部具有乘法运算。这将失败一些!浮点算法不准确,您需要使用其他方法。
Nico Westerdale

1
函数toFixedCustom(num,fixed){var re = new RegExp('^-?\\ d +(?:\。\\ d {0,'+(fixed || -1)+'})?'); if(num.toString()。match(re)){返回num.toString()。match(re)[0]; }
瑞安·奥古斯丁'18年

1
更新的答案将失败,其大小将足以使javascript用科学计数法表示。toFixed(0.0000000052, 2)产生“ 5.2”。可以通过使用“ return num.toFixed(fixed+1).match(re)[0];通知” 来解决此问题,注意我正在使用toFixed并在目标上方
保留

32

我选择写这个代替手动删除带有字符串的余数,因此我不必处理数字附带的数学问题:

num = num.toString(); //If it's not already a String
num = num.slice(0, (num.indexOf("."))+3); //With 3 exposing the hundredths place
Number(num); //If you need it back as a Number

这将为您提供“ 15.77”,num = 15.7784514;


5
如果不强制使用小数,则可能需要添加条件,以防遇到整数。像这样:num = num.toString(); if(num.indexOf(“。”)> 0){num = num.slice(0,(num.indexOf(“。”))+ 3)}}; 数(num);
2012年

1
如果它具有小数,则很好,但如果它是整数,则将失败
RuslanLópez16年

如果数字为0.00000052,那么获得5.2e将会是错误的
Vasanth

1
@Vasanth如果数字为0.00000052,则返回“ 0.00”。答案可能一直以来都经过编辑
-Drenai

是的,它在
极端

18

2017年十月

将数字截断(不舍入)到第n个小数位数并将其转换为正好为n个小数位数(对于任何n≥0)的字符串的一般解决方案。

function toFixedTrunc(x, n) {
  const v = (typeof x === 'string' ? x : x.toString()).split('.');
  if (n <= 0) return v[0];
  let f = v[1] || '';
  if (f.length > n) return `${v[0]}.${f.substr(0,n)}`;
  while (f.length < n) f += '0';
  return `${v[0]}.${f}`
}

其中x可以是数字(转换为字符串)或字符串。

以下是n = 2的一些测试(包括OP要求的测试):

0           => 0.00
0.01        => 0.01
0.5839      => 0.58
0.999       => 0.99
1.01        => 1.01
2           => 2.00
2.551       => 2.55
2.99999     => 2.99
4.27        => 4.27
15.7784514  => 15.77
123.5999    => 123.59
0.000000199 => 1.99 *

*如注释中所述,这是由于javascript将“ 1.99e-7”以及其他一些n值隐式转换为指数:

15.001097   => 15.0010 (n=4)
0.000003298 => 0.0000032 (n=7)
0.000003298257899 => 0.000003298257 (n=12)

2
toFixedTrunc(0.000000199, 2) // 1.99
马哈拉莫夫

1
@ShamkhalMaharramov:如果打开开发控制台并输入0.000000199,会得到什么?您得到1.99e-7。另外,如果输入0.000000199.toString(),会得到什么?您得到“ 1.99e-7”,因此,当您向函数传递0.000000199时,它将最终在“ 1.99e-7”而不是“ 0.000000199”上工作,并且“正确”返回“ 1.99”。见ecma-international.org/ecma-262/6.0/...
SC1000

13

parseInt比Math.floor快

function floorFigure(figure, decimals){
    if (!decimals) decimals = 2;
    var d = Math.pow(10,decimals);
    return (parseInt(figure*d)/d).toFixed(decimals);
};

floorFigure(123.5999)    =>   "123.59"
floorFigure(123.5999, 3) =>   "123.599"

2
它失败1234567.89
鲁斯兰·洛佩斯

您能详细说明洛佩兹吗?
zardilior

3
floorFigure(4.56,2)= 4.55
cryss


6
num = 19.66752
f = num.toFixed(3).slice(0,-1)
alert(f)

这将返回19.66


5
(4.9999).toFixed(3).slice(0,-1)返回5.00,预期结果为4.99。
布鲁诺·莱莫斯

1
我建议改用.toFixed(6).slice(0,-4)之类的东西。
Bruno Lemos

完美,就我而言,还可以。例如,如果我只想使用一个十进制数,请使用num.toFixed(2).slice(0,-1)(如果num有1.2356,则将返回1.2)
Esteban Perez

5

这些解决方案确实有效,但在我看来似乎不必要。我个人喜欢使用模运算符来获得除法运算的余数,并将其删除。假设num = 15.7784514:

num-=num%.01;

这等效于说num = num-(num%.01)。


Nijkokun很有趣,感谢您指出。使用这种技术我从来没有遇到过问题,但是显然我应该仔细研究这样的实例。另外,您可以使用(((num * = 100)-(num%1))/ 100)解决此问题。在我的案例中,优先考虑的是执行速度,这是因为我要对其应用大量计算,这是我发现的最快的实现方法。
jtrick

1
关键是要避免提供的其他解决方案中所需的对象和函数查找以及转换。感谢您的反馈!
jtrick

1
也因为负数而失败,因为负数为-5
RuslanLópez16年

我也对快速舍入感兴趣,您将如何使此代码将小数点后一位?
thednp '16

5

这里的答案对我没有帮助,它一直在四舍五入或给我错误的小数位数。

我的解决方案将您的小数转换为字符串,提取字符,然后将整个内容作为数字返回。

function Dec2(num) {
  num = String(num);
  if(num.indexOf('.') !== -1) {
    var numarr = num.split(".");
    if (numarr.length == 1) {
      return Number(num);
    }
    else {
      return Number(numarr[0]+"."+numarr[1].charAt(0)+numarr[1].charAt(1));
    }
  }
  else {
    return Number(num);
  }  
}

Dec2(99); // 99
Dec2(99.9999999); // 99.99
Dec2(99.35154); // 99.35
Dec2(99.8); // 99.8
Dec2(10265.985475); // 10265.98

Dec2(99)应该返回99.00
VPaul

5

我的正数版本:

function toFixed_norounding(n,p)
{
    var result = n.toFixed(p);
    return result <= n ? result: (result - Math.pow(0.1,p)).toFixed(p);
}

快速,漂亮,显而易见。(版本为正数)


需要浮点值(例如,货币)的非四舍五入,只有小数点后1位。上面的功能应该是该主题的“答案”,它非常好,就像一个咒语。为作者打气,谢谢。:)))
Adrian Tanase's

负值失败。-0.7752。测试它 toFixed_norounding(-0.7752,2)返回-0.78而不是-0.77
Ling Loeng


3

我使用以下简单方法进行了修复-

var num = 15.7784514;
Math.floor(num*100)/100;

结果将是15.77


:它不具有负值的工作-15.7784514回报-15.78
克莱门特Baconnier

3

只需截断数字:

function truncDigits(inputNumber, digits) {
  const fact = 10 ** digits;
  return Math.floor(inputNumber * fact) / fact;
}

3

另一个单行解决方案:

number = Math.trunc(number*100)/100

我使用100是因为您想截断到第二个数字,但是更灵活的解决方案是:

number = Math.trunc(number*Math.pow(10, digits))/Math.pow(10, digits)

其中,数字是要保留的小数位数。

有关详细信息和浏览器兼容性,请参见Math.trunc规范


如果不必支持IE11,这是最佳答案。
TJ。

2

这个给你。答案显示了解决问题的另一种方法:

// For the sake of simplicity, here is a complete function:
function truncate(numToBeTruncated, numOfDecimals) {
    var theNumber = numToBeTruncated.toString();
    var pointIndex = theNumber.indexOf('.');
    return +(theNumber.slice(0, pointIndex > -1 ? ++numOfDecimals + pointIndex : undefined));
}

注意在最终表达式之前使用+。那就是将我们截断的切成字符串的字符串转换回数字类型。

希望能帮助到你!


1
我喜欢这种方法的简单性,并且我认为避免使用数学的所有解决方案都更适合解决此问题。因此,使用slice()等是正确的方法。我的方法的唯一优点是它将处理传入的数字,这些数字是字符串[用引号引起来[单/双]包围]。由于某种原因,当我这样做时,上面的函数在FF中引发了一个错误:console.log('truncate(“ 0.85156”,2)',truncate(“ 0.85156”,2));
Charles Robertson

2

截断不带零

function toTrunc(value,n){  
    return Math.floor(value*Math.pow(10,n))/(Math.pow(10,n));
}

要么

function toTrunc(value,n){
    x=(value.toString()+".0").split(".");
    return parseFloat(x[0]+"."+x[1].substr(0,n));
}

测试:

toTrunc(17.4532,2)  //17.45
toTrunc(177.4532,1) //177.4
toTrunc(1.4532,1)   //1.4
toTrunc(.4,2)       //0.4

用零截断

function toTruncFixed(value,n){
    return toTrunc(value,n).toFixed(n);
}

测试:

toTrunc(17.4532,2)  //17.45
toTrunc(177.4532,1) //177.4
toTrunc(1.4532,1)   //1.4
toTrunc(.4,2)       //0.40

2

这对我来说很好。我希望它也能解决您的问题。

function toFixedNumber(number) {
    const spitedValues = String(number.toLocaleString()).split('.');
    let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
    decimalValue = decimalValue.concat('00').substr(0,2);

    return '$'+spitedValues[0] + '.' + decimalValue;
}

// 5.56789      ---->  $5.56
// 0.342        ---->  $0.34
// -10.3484534  ---->  $-10.34 
// 600          ---->  $600.00

function convertNumber(){
  var result = toFixedNumber(document.getElementById("valueText").value);
  document.getElementById("resultText").value = result;
}


function toFixedNumber(number) {
        const spitedValues = String(number.toLocaleString()).split('.');
        let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
        decimalValue = decimalValue.concat('00').substr(0,2);

        return '$'+spitedValues[0] + '.' + decimalValue;
}
<div>
  <input type="text" id="valueText" placeholder="Input value here..">
  <br>
  <button onclick="convertNumber()" >Convert</button>
  <br><hr>
  <input type="text" id="resultText" placeholder="result" readonly="true">
</div>


2

接下来是一种简单的方法,但是有必要确保将数量参数指定为字符串。

function truncate(amountAsString, decimals = 2){
  var dotIndex = amountAsString.indexOf('.');
  var toTruncate = dotIndex !== -1  && ( amountAsString.length > dotIndex + decimals + 1);
  var approach = Math.pow(10, decimals);
  var amountToTruncate = toTruncate ? amountAsString.slice(0, dotIndex + decimals +1) : amountAsString;  
  return toTruncate
    ?  Math.floor(parseFloat(amountToTruncate) * approach ) / approach
    :  parseFloat(amountAsString);

}

console.log(truncate("7.99999")); //OUTPUT ==> 7.99
console.log(truncate("7.99999", 3)); //OUTPUT ==> 7.999
console.log(truncate("12.799999999999999")); //OUTPUT ==> 7.99

2

function formatLimitDecimals(value, decimals) {
  value = value.toString().split('.')

  if (value.length === 2) {
    return Number([value[0], value[1].slice(0, decimals)].join('.'))
  } else {
    return Number(value[0]);
  }
}

console.log(formatLimitDecimals(4.156, 2)); // 4.15
console.log(formatLimitDecimals(4.156, 8)); // 4.156
console.log(formatLimitDecimals(4.156, 0)); // 4


1

我曾经(num-0.05).toFixed(1)把第二个小数点设为底数。


1

我在打字稿中的解决方案(可以轻松地移植到JS):

/**
 * Returns the price with correct precision as a string
 *
 * @param   price The price in decimal to be formatted.
 * @param   decimalPlaces The number of decimal places to use
 * @return  string The price in Decimal formatting.
 */
type toDecimal = (price: number, decimalPlaces?: number) => string;
const toDecimalOdds: toDecimal = (
  price: number,
  decimalPlaces: number = 2,
): string => {
  const priceString: string = price.toString();
  const pointIndex: number = priceString.indexOf('.');

  // Return the integer part if decimalPlaces is 0
  if (decimalPlaces === 0) {
    return priceString.substr(0, pointIndex);
  }

  // Return value with 0s appended after decimal if the price is an integer
  if (pointIndex === -1) {
    const padZeroString: string = '0'.repeat(decimalPlaces);

    return `${priceString}.${padZeroString}`;
  }

  // If numbers after decimal are less than decimalPlaces, append with 0s
  const padZeroLen: number = priceString.length - pointIndex - 1;
  if (padZeroLen > 0 && padZeroLen < decimalPlaces) {
    const padZeroString: string = '0'.repeat(padZeroLen);

    return `${priceString}${padZeroString}`;
  }

  return priceString.substr(0, pointIndex + decimalPlaces + 1);
};

测试用例:

  expect(filters.toDecimalOdds(3.14159)).toBe('3.14');
  expect(filters.toDecimalOdds(3.14159, 2)).toBe('3.14');
  expect(filters.toDecimalOdds(3.14159, 0)).toBe('3');
  expect(filters.toDecimalOdds(3.14159, 10)).toBe('3.1415900000');
  expect(filters.toDecimalOdds(8.2)).toBe('8.20');

有什么改善吗?


0

toFixed发挥自己的作用:对于正值,Math.floor效果很好。

function toFixed(num, fixed) {
    fixed = fixed || 0;
    fixed = Math.pow(10, fixed);
    return Math.floor(num * fixed) / fixed;
}

对于负值,Math.floor是取整值。因此您可以Math.ceil改用。

例,

Math.ceil(-15.778665 * 10000) / 10000 = -15.7786
Math.floor(-15.778665 * 10000) / 10000 = -15.7787 // wrong.

5
因此,这些答案中有许多在Math.floor()函数内部具有乘法运算。这将失败一些!浮点算法不准确,您需要使用其他方法。
Nico Westerdale

0

Gumbo的第二个解决方案带有正则表达式,虽然可以工作,但是由于正则表达式而比较慢。由于浮点数的不精确性,Gumbo的第一种解决方案在某些情况下会失败。参见JSFiddle演示和基准,。第二种解决方案在我当前的系统(3.30 GHz的Intel Core i5-2500 CPU)上每次调用大约花费1636纳秒。

我编写的解决方案包括添加少量补偿以解决浮点不精确性。它基本上是瞬时的,即约纳秒。我为每个调用计时2纳秒,但JavaScript计时器不是很精确或精细。这是JS Fiddle和代码。

function toFixedWithoutRounding (value, precision)
{
    var factorError = Math.pow(10, 14);
    var factorTruncate = Math.pow(10, 14 - precision);
    var factorDecimal = Math.pow(10, precision);
    return Math.floor(Math.floor(value * factorError + 1) / factorTruncate) / factorDecimal;
}

var values = [1.1299999999, 1.13, 1.139999999, 1.14, 1.14000000001, 1.13 * 100];

for (var i = 0; i < values.length; i++)
{
    var value = values[i];
    console.log(value + " --> " + toFixedWithoutRounding(value, 2));
}

for (var i = 0; i < values.length; i++)
{
    var value = values[i];
    console.log(value + " --> " + toFixedWithoutRounding(value, 4));
}

console.log("type of result is " + typeof toFixedWithoutRounding(1.13 * 100 / 100, 2));

// Benchmark
var value = 1.13 * 100;
var startTime = new Date();
var numRun = 1000000;
var nanosecondsPerMilliseconds = 1000000;

for (var run = 0; run < numRun; run++)
    toFixedWithoutRounding(value, 2);

var endTime = new Date();
var timeDiffNs = nanosecondsPerMilliseconds * (endTime - startTime);
var timePerCallNs = timeDiffNs / numRun;
console.log("Time per call (nanoseconds): " + timePerCallNs);

0

David D的答案为基础:

function NumberFormat(num,n) {
  var num = (arguments[0] != null) ? arguments[0] : 0;
  var n = (arguments[1] != null) ? arguments[1] : 2;
  if(num > 0){
    num = String(num);
    if(num.indexOf('.') !== -1) {
      var numarr = num.split(".");
      if (numarr.length > 1) {
        if(n > 0){
          var temp = numarr[0] + ".";
          for(var i = 0; i < n; i++){
            if(i < numarr[1].length){
              temp += numarr[1].charAt(i);
            }
          }
          num = Number(temp);
        }
      }
    }
  }
  return Number(num);
}

console.log('NumberFormat(123.85,2)',NumberFormat(123.85,2));
console.log('NumberFormat(123.851,2)',NumberFormat(123.851,2));
console.log('NumberFormat(0.85,2)',NumberFormat(0.85,2));
console.log('NumberFormat(0.851,2)',NumberFormat(0.851,2));
console.log('NumberFormat(0.85156,2)',NumberFormat(0.85156,2));
console.log('NumberFormat(0.85156,4)',NumberFormat(0.85156,4));
console.log('NumberFormat(0.85156,8)',NumberFormat(0.85156,8));
console.log('NumberFormat(".85156",2)',NumberFormat(".85156",2));
console.log('NumberFormat("0.85156",2)',NumberFormat("0.85156",2));
console.log('NumberFormat("1005.85156",2)',NumberFormat("1005.85156",2));
console.log('NumberFormat("0",2)',NumberFormat("0",2));
console.log('NumberFormat("",2)',NumberFormat("",2));
console.log('NumberFormat(85156,8)',NumberFormat(85156,8));
console.log('NumberFormat("85156",2)',NumberFormat("85156",2));
console.log('NumberFormat("85156.",2)',NumberFormat("85156.",2));

// NumberFormat(123.85,2) 123.85
// NumberFormat(123.851,2) 123.85
// NumberFormat(0.85,2) 0.85
// NumberFormat(0.851,2) 0.85
// NumberFormat(0.85156,2) 0.85
// NumberFormat(0.85156,4) 0.8515
// NumberFormat(0.85156,8) 0.85156
// NumberFormat(".85156",2) 0.85
// NumberFormat("0.85156",2) 0.85
// NumberFormat("1005.85156",2) 1005.85
// NumberFormat("0",2) 0
// NumberFormat("",2) 0
// NumberFormat(85156,8) 85156
// NumberFormat("85156",2) 85156
// NumberFormat("85156.",2) 85156


0

已经有一些关于正则表达式和算术计算的合适答案,您也可以尝试一下

function myFunction() {
    var str = 12.234556; 
    str = str.toString().split('.');
    var res = str[1].slice(0, 2);
    document.getElementById("demo").innerHTML = str[0]+'.'+res;
}

// output: 12.23

0

这是字符串的作用

export function withoutRange(number) {
  const str = String(number);
  const dotPosition = str.indexOf('.');
  if (dotPosition > 0) {
    const length = str.substring().length;
    const end = length > 3 ? 3 : length;
    return str.substring(0, dotPosition + end);
  }
  return str;
}


0

最有效的解决方案(对于2个小数位数)是在调用前减去0.005 toFixed()

function toFixed2( num ) { return (num-0.005).toFixed(2) }

负数也将四舍五入(远离零)。OP没有透露有关负数的任何信息。


0

我知道已经有几个工作示例,但是我认为值得提出我的String.toFixed等效项,有些人可能会觉得有用。

那是我的toFixed替代方案,它不舍入数字,只是根据给定的精度将其截断或加零。对于更长的数字,当精度很高时,它使用JS内置舍入。函数适用于我在堆栈中发现的所有有问题的数字。

function toFixedFixed(value, precision = 0) {
    let stringValue = isNaN(+value) ? '0' : String(+value);

    if (stringValue.indexOf('e') > -1 || stringValue === 'Infinity' || stringValue === '-Infinity') {
        throw new Error('To large number to be processed');
    }

    let [ beforePoint, afterPoint ] = stringValue.indexOf('.') > -1 ? stringValue.split('.') : [ stringValue, ''];

    // Force automatic rounding for some long real numbers that ends with 99X, by converting it to string, cutting off last digit, then adding extra nines and casting it on number again
    // e.g. 2.0199999999999996: +('2.019999999999999' + '9999') will give 2.02
    if (stringValue.length >= 17 && afterPoint.length > 2 && +afterPoint.substr(afterPoint.length - 3) > 995) {
        stringValue = String(+(stringValue.substr(0, afterPoint.length - 1) + '9'.repeat(stringValue.split('.').shift().length + 4)));
        [ beforePoint, afterPoint ] = String(stringValue).indexOf('.') > -1 ? stringValue.split('.') : [ stringValue, ''];
    }

    if (precision === 0) {
        return beforePoint;
    } else if (afterPoint.length > precision) {
        return `${beforePoint}.${afterPoint.substr(0, precision)}`;
    } else {
        return `${beforePoint}.${afterPoint}${'0'.repeat(precision - afterPoint.length)}`;
    }
}

请记住,对于长度大于等于18的数字,精度可能无法正确处理,例如64位Chrome将对其进行舍入或添加“ e +” /“ e-”以将数字长度保持为18。

如果要对实数执行运算,将其乘以Math.sqrt(10, precision),进行计算,然后将结果乘以乘数就更安全了。

例:

0.06 + 0.010.06999999999999999,并且所有不舍入的格式化函数都会将其截断0.06为精确2

但是,如果您要使用乘法器和除法器执行相同的操作: (0.06 * 100 + 0.01 * 100) / 100,则会得到0.07

这就是为什么在使用javascript处理实数时使用这种乘数/除法器如此重要的原因,尤其是在您计算货币时...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.