ฉันเพิ่งเจอสถานการณ์ที่คล้ายกันและรู้สึกประหลาดใจกับปัญหาการปัดเศษของ 'ตัวเลขขนาดใหญ่มาก' ที่นำเสนอภายใน SSMS v17.9.1 / SQL 2017
ฉันไม่ได้แนะนำว่าฉันมีวิธีแก้ปัญหา แต่ฉันสังเกตว่าFORMAT นำเสนอตัวเลขที่ดูเหมือนถูกต้อง ฉันไม่สามารถบอกเป็นนัยได้ว่าสิ่งนี้ช่วยลดปัญหาการปัดเศษเพิ่มเติมหรือมีประโยชน์ในฟังก์ชันทางคณิตศาสตร์ที่ซับซ้อน
T SQL Code ที่ให้มาซึ่งควรแสดงให้เห็นอย่างชัดเจนถึงข้อสังเกตของฉันในขณะที่ให้ผู้อื่นทดสอบโค้ดและแนวคิดของพวกเขาหากจำเป็น
WITH Units AS
(
SELECT 1.0 AS [RaisedPower] , 'Ten' As UnitDescription
UNION ALL
SELECT 2.0 AS [RaisedPower] , 'Hundred' As UnitDescription
UNION ALL
SELECT 3.0 AS [RaisedPower] , 'Thousand' As UnitDescription
UNION ALL
SELECT 6.0 AS [RaisedPower] , 'Million' As UnitDescription
UNION ALL
SELECT 9.0 AS [RaisedPower] , 'Billion' As UnitDescription
UNION ALL
SELECT 12.0 AS [RaisedPower] , 'Trillion' As UnitDescription
UNION ALL
SELECT 15.0 AS [RaisedPower] , 'Quadrillion' As UnitDescription
UNION ALL
SELECT 18.0 AS [RaisedPower] , 'Quintillion' As UnitDescription
UNION ALL
SELECT 21.0 AS [RaisedPower] , 'Sextillion' As UnitDescription
UNION ALL
SELECT 24.0 AS [RaisedPower] , 'Septillion' As UnitDescription
UNION ALL
SELECT 27.0 AS [RaisedPower] , 'Octillion' As UnitDescription
UNION ALL
SELECT 30.0 AS [RaisedPower] , 'Nonillion' As UnitDescription
UNION ALL
SELECT 33.0 AS [RaisedPower] , 'Decillion' As UnitDescription
)
SELECT UnitDescription
, POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] ) AS ReturnsFloat
, CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] ) AS NUMERIC (38,0) ) AS RoundingIssues
, STR( CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] ) AS NUMERIC (38,0) ) , CAST([RaisedPower] AS INT) + 2, 0) AS LessRoundingIssues
, FORMAT( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] ) , '0') AS NicelyFormatted
FROM Units
ORDER BY [RaisedPower]
cast(float_field as varchar(max))
มิฉะนั้นฉันจะไม่ได้รับคำถาม