나는 mysql 데이터베이스에서 금리를 다룬다. 이들은 두 배로 저장되며 일반적으로 소수점 1/1000 (예 : 4.657)이지만 때로는 더 많습니다. 때로는 이것들에 대해서만 백분의 일 장소 (예 : 4.65)에보고해야하지만 나는 이것을 둘 수 없다 - 나는 그것을 잘라야 할 필요가있다. 그래서, 5.6575 %의 데이터베이스에서 내 이자율, 5.65 %가 아니라 5.65 %를 얻을 필요가있다.MYSQL 수치 함수 (floor, truncate)가 예상대로 작동하지 않습니다 - 설명?
일반적으로 TRUNCATE (int_rate, 2)는 정상적으로 작동합니다. 이것은 지금까지 아무런 문제없이 나를 위해 일해 왔습니다.
8.0300 %, 8.0400 %, 9.0300 %, 9.0400 %, 10.0300 %, 10.0400 % ... 등의 금리에 문제가 있습니다. 금리가 8 % 이상이고 3 또는 4는 100 위이고 나머지는 0입니다.
8.04가 DB에 있으면 TRUNCATE (int_rate, 2) 할 때 8.03을 반환합니다. FLOOR (int_rate * 100)/100
숫자를 하드 코딩하고 DB에서 가져 오지 않으면 TRUNCATE (8.04, 2) 또는 TRUNCATE가 제대로 자릅니다. (8.0400, 2)는 예상대로 8.04를 반환합니다.
4.0400 %는 훌륭하게 작동합니다. 그래서 8.0600 %입니다! 왜 이러한 결과를 주는가? 또한 누군가가이 오류없이이 작업을 수행 할 수있는 방법을 제안 할 수 있다면 그것은 경이로운 것입니다!
의 MySQL은 : 5.0.95
부동 소수점 숫자는 대략적인 '8.04'는 실제로'8.0399999999'와 같은 것이므로, 그것을 잘라내는 것은'8.03'을 반환합니다. – Barmar
'8.04'를 하드 코딩하면 'DOUBLE'이 아닌 'DECIMAL'로 해석되므로 정밀도를 잃지 않습니다. 왜 테이블에'DECIMAL' 타입을 사용하지 않습니까? 이것은 정밀도를 잃을 수없는 응용 프로그램을 위해 설계되었습니다. – Barmar