float vs decimal을 사용하는 경우


14

이 API를 빌드 중이며 데이터베이스는 다음 중 하나를 나타내는 값을 저장합니다.

  • 백분율
  • 평균

나는 솔직히 숫자의 범위가 0에서 100 % 사이 인 것을 표현하는 방법을 모른다. 그럴까요

  • 0.00-1.00
  • 0.00-100.00
  • 내가 모르는 다른 대안

그것에 대한 명확한 선택이 있습니까? 데이터베이스에서 0 %에서 100 % 사이의 데이터를 나타내는 글로벌 방식? 더 나아가서, 그 유형에 맞는 올바른 유형, 부동 또는 소수는 무엇입니까?

감사합니다.



5
숫자는 여러 가지 방법으로 저장 될 수 있습니다. 0-100을 사용하여 백분율을 저장하거나 0-1을 사용하여 본질적으로 잘못된 것은 없습니다. 중요한 것은 숫자로 수행해야 할 작업, 필요한 정확도 등입니다. 좋은 대답을하기 전에 더 많은 내용을 설명해야합니다. 소수의 소수로 정확하게 표현할 수있는 숫자를 저장해야합니까? 평균을 계산하면 3 분의 1이나 7 분의 1과 같은 분수를 얻게됩니다. 그것들을 정확하게 저장해야합니까? 아니면 그냥? 대략? 그들과 함께 무엇을 할 것인가?
에릭 Postpischil

1
값이 0.01에서 단계적으로 0.00에서 100.00 인 경우 10001의 다른 값입니다. 단순히를 사용 int나타내는 백분 또는 단위로 Permyriad 또는 ‱을.
chux-

@ chux-ReinstateMonica-네, "정수"는 가능하지만 어색합니다.
Rick James

@RickJames 아마도. 스케일 정수가 어렵다는 것을 알지 못했습니다.
chux-복원 Monica Monica

답변:


4

반대 입장을 취하겠습니다.

FLOAT는 백분율, 평균 등과 같은 대략적인 숫자를위한 것입니다. 앱 코드에서 또는 FORMAT()MySQL 의 기능을 사용하여 값을 표시 할 때 형식을 지정해야합니다 .

테스트하지 마십시오 float_value = 1.3. 실패하는 데는 여러 가지 이유가 있습니다.

DECIMAL금전적 가치에 사용되어야합니다. DECIMAL값을 달러 / 센트 / 유로 등으로 반올림해야 할 때 두 번째 반올림을 피합니다. 회계사는 센트를 좋아하지 않습니다.

MySQL의 구현은 DECIMAL65 자리 유효 숫자 를 허용합니다. FLOAT7에 대한 및 제공 DOUBLE(7) (16)에 대해 보통 이상의 센서 및 과학 계산에 충분하다.

"백분율"과 관련하여-때로는 TINYINT UNSIGNED1 바이트의 저장 공간 만 소비하고 정밀도가 필요하지 않은 경우에 사용했습니다. 때로는 FLOAT(4 바이트)를 사용했습니다. 백분율에 맞게 특별히 조정 된 데이터 유형이 없습니다. (또한 DECIMAL(2,0)값을 보유 할 수 100없으므로 기술적으로 필요합니다 DECIMAL(3,0).)

또는 때로는 FLOAT0과 1 사이의 값을 가진를 사용했지만 "백분율"을 표시하기 전에 100을 곱해야합니다.

"백분율, 평균, 속도"의 세 가지가 모두 수레처럼 냄새가납니다.

데이터 유형을 결정하기위한 하나의 기준 ... 값의 사본이 몇 개 존재합니까?

백분율이있는 열이있는 10 억 행 테이블이있는 경우 TINYINT1 바이트 (총 1GB)가 필요하지만 FLOAT4 바이트 (총 4GB)가 필요 하다는 것을 고려하십시오 . OTOH, 대부분의 응용 프로그램에는 행이 많지 않으므로 관련이 없을 수 있습니다.

는 '일반'규칙으로, "정확한"값은 어떤 형태를 사용해야 INT하거나 DECIMAL. 부정확 한 것 (과학적 계산, 제곱근, 나눗셈 등)을 사용해야합니다 FLOAT(또는 DOUBLE).

또한 출력 형식 은 일반적으로 응용 프로그램 프런트 엔드에 남겨 두어야합니다. 즉, "평균"이 "14.6666666 ..."으로 계산 될 수 있지만 디스플레이에는 "14.7"과 같은 것이 표시되어야합니다. 이것은 인간에게 더 친숙합니다. 한편, 나중에 "15"또는 "14.667"을 선호하는 출력 형식으로 결정할 기본 값이 있습니다.

"0.00-100.00"범위 FLOAT 는 출력 형식을 사용 하거나 항상 지정된 정밀도를 원할 것이라는 사전 결정과 함께 DECIMAL(5,2)(3 바이트) 사용 하여 수행 할 수 있습니다 .


3

나는 일반적으로 사용하지 않는 것이 좋습니다 float. 부동 소수점 숫자는 밑이 2 인 숫자를 나타내며, 이로 인해 일부 (정확한) 숫자가 연산 또는 비교에서 반올림됩니다.이 숫자는 밑이 2에 정확하게 저장 될 수 없기 때문입니다. 이것은 놀라운 행동으로 이어질 수 있습니다.

다음 예제를 고려 하십시오 .

create table t (num float);
insert into t values(1.3);

select * from t;

| num |
| --: |
| 1.3 |

select * from t where num = 1.3;

| num |
| --: |

숫자의 1.3밑이 2 비교에 실패합니다. 까다 롭습니다.

이에 비해 10 진수는 해당 범위 내의 유한 숫자를 정확하게 표현합니다. 당신이 변경하는 경우 floatdecimal(2, 1)위의 예에서, 당신은 예상 된 결과를 얻는다.


4
이 답변은 여러 측면에서 허위입니다. “소수점은 범위가 더 작지만 해당 범위 내의 유한 숫자를 정확하게 표현합니다.”는 거짓입니다. 10 진수는 ⅓를 정확하게 나타내지 않습니다. "일부 (정확하고 유한 한) 숫자는 올림됩니다"가 잘못되었습니다. 숫자는 "반올림"이 아닙니다. 변환 및 기타 작업은 반올림 될 수 있습니다. 기본 반올림 모드는 가장 일반적으로 반올림이 아닌 가장 가까운 반올림입니다.
에릭 Postpischil

4
정확도 문제는 "부동 소수점 수"때문이 아니라 단순히 숫자 표현으로 인한 것입니다. 모든 유한 숫자 표현은 정확도가 제한적입니다. 부동 소수점, 고정 소수점, 정수, 유리수, 소수, 이진, 모든 것.
에릭 Postpischil

2
한숨. 무엇을 고쳤습니까? 내 의견은 십진수가 범위 내에서 숫자를 정확하게 표현한다고 말했기 때문에 대답이 잘못되었다고 말하지만 실제로 ⅓를 정확하게 표현하지 않기 때문에 그렇지 않습니다. 변경 사항에 "정확한"대신 "정확한"이라고 표시되어 있지만 왜 이진 부동 소수점이 그다지 좋지 않은지 – 왜 정확한지에 대한 임계 값이 얼마인지, 정밀도가 어느 정도인지에 따라 ⅓에 대해 정확하지 않으며 둘 다 정확하지 않습니다. 그들은 가지고있다. 질문은 평균이 표현 될 것임을 나타내며, 세 가지를 평균하면 ⅓와 같은 숫자가 표시됩니다.
에릭 Postpischil

4
이 의견에 따르면 가장 가까운 반올림은 가장 일반적으로 사용되지만 대답은 여전히 ​​올림입니다. 답은 비교는 반올림 할 수 있지만 비교는 완벽합니다. 비교는 반올림없이 항상 수학적으로 올바른 결과를 반환합니다. (일부 프로그래밍 언어는 비교하기 전에 피연산자를 변환 할 수 있지만 별도의 연산입니다.)
Eric Postpischil

1
1/3은 이진수 나 십진수 로 정확하게 표현 될 수 없습니다 . $ 14.99에서 20 % 할인을 받으려면 소수 센트가 필요하지 않습니다.
Rick James

0

float와 decimal의 차이점은 정밀도입니다. 10 진수는 10 진수 형식의 정밀도 내에있는 숫자를 100 % 정확하게 나타낼 수있는 반면 Float는 모든 숫자를 정확하게 나타낼 수는 없습니다.

재무 관련 값에는 10 진수를 사용하고 그래픽 관련 값에는 10 진수를 사용하십시오.


0

정확한 정밀도를 유지하기 위해 decimal(5,2)표시하는 것과 같은 방식으로 저장하려는 경우 사용 하는 것이 좋습니다 decimal. ( https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html 참조 )

부동 소수점 값은 근사값이며 정확한 값으로 저장되지 않으므로 값을 정확하게 비교하려고하면 문제가 발생할 수 있습니다. 또한 플랫폼 또는 구현 종속성에 종속됩니다.

( https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html )

SQL 문에 작성된 부동 소수점 값은 내부적으로 표시된 값과 같지 않을 수 있습니다.

DECIMAL 열의 경우 MySQL은 소수점 이하 65 자리의 정밀도로 작업을 수행하므로 가장 일반적인 부정확성 문제를 해결할 수 있습니다.

https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html


0

Decimal : 재무 응용 프로그램의 경우 Decimal 유형을 사용하는 것이 좋습니다. Decimal 유형은 높은 수준의 정확성을 제공하고 반올림 오류를 피하기 쉽기 때문입니다.

Double : Double Type은 돈을 처리하는 것을 제외하고 실제 값에 가장 일반적으로 사용되는 데이터 유형입니다.

Float : 처리 능력에 대한 요구가 매우 높고 반올림 오류를 견딜 수있는 상황을 사용하기 때문에 주로 그래픽 라이브러리에서 사용됩니다.

참조 : http://net-informations.com/q/faq/float.html


0
mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G

*********************************************************************

@a := (a/3): 33.333333333
@b := (b/3): 33.333333333333
@a + @a + @a: 99.999999999000000000000000000000
@b + @b + @b: 100

십진수는이 경우에해야 할 일을 정확하게 수행했으며 나머지는 잘랐으므로 1/3 부분을 잃었습니다.

따라서 합계의 경우 소수점이 더 좋지만 나누기의 경우 부동 소수점이 더 좋습니다. DECIMAL을 사용해도 "실패한 산술"을 제공하지는 않습니다.

이것이 도움이되기를 바랍니다.


0

tsql에서 : Float, 0.0은 0으로 저장되며 소수점 이하 자릿수를 정의 할 필요가 없습니다. 예를 들어 Float (4,2)를 쓸 필요가 없습니다. Decimal, 0.0은 0.0으로 저장하고 decimal (4,2)와 같이 정의 할 수있는 옵션이 있습니다 .0.00-1.00을 제안하면 100을 곱하지 않고 해당 백분율 값을 계산할 수 있습니다.보고하면 데이터 유형을 설정하십시오. 해당 열의 비율은 MS Excel 및 기타 플랫폼보기와 같은 백분율 0.5 -> 50%입니다.

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