소수점 뒤에 주어진 정밀도로 Dart에서 double을 어떻게 반올림합니까?


125

double이 주어지면 PHP의 round () 함수와 유사하게 소수점 뒤의 주어진 정밀도 점수로 반올림하고 싶습니다 .

Dart 문서에서 찾을 수있는 가장 가까운 것은 double.toStringAsPrecision ()이지만 , 전체 정밀도 포인트에서 소수점 의 숫자 포함하기 때문에 필요한 것은 아닙니다 .

예를 들어 toStringAsPrecision (3) 사용 :

0.123456789 rounds to 0.123  
9.123456789 rounds to 9.12  
98.123456789 rounds to 98.1  
987.123456789 rounds to 987  
9876.123456789 rounds to 9.88e+3

숫자의 크기가 증가함에 따라 소수점 이하 자릿수를 잃습니다.

답변:


208

num.toStringAsFixed ()에 대한 문서를 참조하십시오 .

문자열 toStringAsFixed (int fractionDigits)

이것의 소수점 문자열 표현을 리턴합니다.

문자열 표현을 계산하기 전에 이것을 double로 변환합니다.

  • 이것의 절대 값이 10 ^ 21 이상이면이 메서드는 this.toStringAsExponential ()에 의해 계산 된 지수 표현을 반환합니다 .

예 :

1000000000000000000000.toStringAsExponential(3); // 1.000e+21
  • 그렇지 않으면 결과는 소수점 뒤에 정확히 fractionDigits 자릿수가있는 가장 가까운 문자열 표현입니다. fractionDigits가 0이면 소수점이 생략됩니다.

fractionDigits 매개 변수는 0 <= fractionDigits <= 20을 만족하는 정수 여야합니다.

예 :

1.toStringAsFixed(3);  // 1.000
(4321.12345678).toStringAsFixed(3);  // 4321.123
(4321.12345678).toStringAsFixed(5);  // 4321.12346
123456789012345678901.toStringAsFixed(3);  // 123456789012345683968.000
1000000000000000000000.toStringAsFixed(3); // 1e+21
5.25.toStringAsFixed(0); // 5

허용되어야 함 + 참조 + 설명 + 예
Kohls dec

1
나는 불일치로 인해 사용할 반올림 방법 인 toStringAsFixed ()라고 주장합니다. 예를 들어, 시도하십시오5.550.toStringAsFixed(1)
brendan

또한 표현식 int이 a 대신 a double를 반환하므로 0 자리로 반올림 할 때주의하십시오. 예를 들어이 경우 끝에 num.parse(50.123.toStringAsFixed(0)) is int추가 .toDouble()하여 수정할 수 있습니다 .
abulka

67

num.toStringAsFixed()라운드. 이것은 num (n)을 원하는 소수 자릿수 (2)의 문자열로 변환 한 다음, 한 줄의 코드에서 다시 num으로 구문 분석합니다.

n = num.parse(n.toStringAsFixed(2));

7
이것이 가장 빠른 방법입니다. 하지만 다트가 이것을 할 수있는 직접적인 방법이 없다는 것은
어리석은

1
연장 방법 : extension NumberRounding on num { num toPrecision(int precision) { return num.parse((this).toStringAsFixed(precision)); } }
Vit Veres

31

위의 솔루션은 숫자를 적절하게 반올림하지 않습니다. 나는 사용한다:

double dp(double val, int places){ 
   double mod = pow(10.0, places); 
   return ((val * mod).round().toDouble() / mod); 
}

확인, 이것은 @brendan이 지적한 것처럼 약간 잘못된 대답을 제공하는 가장 인기있는 대답과 달리 dp(5.550, 1)올바르게 반올림 됩니다 . 5.65.5
abulka

그것은 73.47 대신 73.48를 반환 (73.4750 2) DP 작동하지 않습니다 calculatorsoup.com/calculators/math/... 이 링크를 체크 아웃
깊은 샤


19
void main() {
  int decimals = 2;
  int fac = pow(10, decimals);
  double d = 1.234567889;
  d = (d * fac).round() / fac;
  print("d: $d");
}

인쇄 : 1.23


1
이것이 현재 가장 좋은 방법입니다. 0.01과 같은 정밀도로 반올림하는 것은 그 자체가 double도 아니고 사소한 것도 아닙니다. 결과는 전혀 double로 표현할 수 없을 수도 있습니다. 소수 정밀도가 중요한 모든 곳에 정수를 사용하는 것이 좋습니다 (예 : 돈).
lrn

1
또한 js로 컴파일하는 경우 Dart 정수도 정밀도를 잃기 시작하므로 다음과 같은 패키지를 사용해야합니다. pub.dartlang.org/packages/bignum
Greg Lowe

이 방법은 현재 가장 훌륭하고 우아한 방법으로 느껴집니다.
Giovanni

double을 int에 할당 할 수 없습니다. 3 행에서 오류가 발생했습니다.
Gayan Pathirage

13

Dart에서 double을 소수점 toStringAsFixed()뒤에 주어진 정밀도로 반올림하려면 dart 방법 에서 내장 솔루션을 사용할 수 있지만 다시 double로 변환해야합니다.

void main() {
  double step1 = 1/3;  
  print(step1); // 0.3333333333333333
  
  String step2 = step1.toStringAsFixed(2); 
  print(step2); // 0.33 
  
  double step3 = double.parse(step2);
  print(step3); // 0.33
}


11

확장을 정의합니다.

extension Ex on double {
  double toPrecision(int n) => double.parse(toStringAsFixed(n));
}

용법:

void main() {
  double d = 2.3456789;
  double d1 = d.toPrecision(1); // 2.3
  double d2 = d.toPrecision(2); // 2.35
  double d3 = d.toPrecision(3); // 2.345
}

10

Dart Extension 메서드를 사용하는 @andyw의 수정 된 답변 :

extension Precision on double {
    double toPrecision(int fractionDigits) {
        double mod = pow(10, fractionDigits.toDouble());
        return ((this * mod).round().toDouble() / mod);
    }
}

용법:

var latitude = 1.123456;
var latitudeWithFixedPrecision = latitude.toPrecision(3); // Outputs: 1.123

8

toStringAsFixed소수점 뒤에 한정된 숫자를 표시하기 위해 사용할 수 있습니다 . toStringAsFixed소수점 문자열 표현을 반환합니다. 우리가 표시하고자하는 소수점 이하 자릿수를 toStringAsFixed나타내는 인수를받습니다 fraction Digits. 사용 방법은 다음과 같습니다.

double pi = 3.1415926;
const val = pi.toStringAsFixed(2); // 3.14

4

toStringAsFixed()방법을 사용하여 소수점 EX 뒤의 특정 숫자로 숫자를 반올림했습니다.

double num = 22.48132906

다음과 같이 두 개의 숫자로 반올림했을 때 :

print(num.toStringAsFixed(2)) ;

인쇄 22.48

하나의 숫자로 반올림했을 때 22.5


2

위의 솔루션이 모든 경우에 작동하는 것은 아닙니다. 내 문제에 효과가 있었던 것은 숫자 (0.5에서 1 또는 0.49에서 0)를 반올림 하고 소수점없이 그대로 두는 이 솔루션이었습니다 .

입력 : 12.67

double myDouble = 12.67;
var myRoundedNumber; // Note the 'var' datatype

// Here I used 1 decimal. You can use another value in toStringAsFixed(x)
myRoundedNumber = double.parse((myDouble).toStringAsFixed(1));
myRoundedNumber = myRoundedNumber.round();

print(myRoundedNumber);

출력 : 13

이 링크에는 다른 솔루션도 있습니다.


0

결과 소수가 모두 0 일 때 소수를 원하지 않는 경우 다음과 같이 작동합니다.

String fixedDecimals(double d, int decimals, {bool removeZeroDecimals = true}){
  double mod = pow(10.0, decimals);
  double result = ((d * mod).round().toDouble() / mod);
  if( removeZeroDecimals && result - (result.truncate()) == 0.0 ) decimals = 0;
  return result.toStringAsFixed(decimals);
}

입력이 있고 소수점 2 자리를 원하는 경우 9대신 단순히 출력 됩니다 .9.009.004


-5

이것은 꽤 잘 작동합니다

var price=99.012334554
price = price.roundTodouble();
print(price); // 99.01
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.