我有一個關于在 SQL Server 中管理貨幣列百分比的問題。我有一個這樣的簡化案例:
CREATE TABLE _ROUNDERROR
(
Premium Money,
Commission Money
)
INSERT INTO _ROUNDERROR (Premium, Commission)
VALUES (1632.33, 408.08)
INSERT INTO _ROUNDERROR (Premium, Commission)
VALUES (408.08, 163.23)
當我執行以下
SELECT
*,
(Commission / Premium) AS RAWDIV,
CAST(Commission AS decimal) / CAST(Premium AS decimal) AS DECDIV,
ROUND(CAST(Commission AS decimal) /CAST(Premium AS decimal), 4) AS DECDIV4,
CAST(Commission AS float) / CAST(Premium AS float) AS FLODIV,
ROUND(CAST(Commission AS float) / CAST(Premium AS float), 4) AS FLODIV4
FROM
_ROUNDERROR
這些是此查詢的結果:
PREMIUM COMMISSION RAWDIV DECDIV DECDIV4 FLODIV FLODIV4
--------------------- --------------------- --------------------- --------------------------------------- --------------------------------------- ---------------------- ----------------------
1632,33 408,08 0,2499 0.2500000000000000000 0.2500000000000000000 0,249998468446944 0,25
408,08 163,23 0,3999 0.3995098039215686274 0.3995000000000000000 0,399995099000196 0,4
如上所示,如果我將錢列分開,SQL Server 的結果就是上限。因此,在閱讀了一些有關的帖子之后,我嘗試在劃分它們之前將兩列都轉換為十進制,并且它適用于第一對值(第一行)。但是小數也失去了精度(在第二行),我決定將其轉換為浮點數(見第二行)。
好的,它現在可以作業了,但這是最好的解決方案嗎?有沒有副作用?我無法更改欄位的型別,因為它是舊資料庫。
uj5u.com熱心網友回復:
decimal不適合您的原因是因為您沒有指定任何比例和精度,因此它默認為decimal(18,0)并通過舍入立即丟失任何小數部分。
CAST(1632.63 as decimal) 例如,給出 1633。
您應該指定適合支持的范圍的精度和比例money。
decimal(19,4)將代表922,337,203,685,477.5807究竟盡管你可能要降低精度,如果你的錢值是從來沒有接近這些限制的任何地方。
SELECT
*,
(Commission / Premium) AS RAWDIV,
CAST(Commission AS decimal(19,4)) / CAST(Premium AS decimal(19,4)) AS DECDIV,
CAST(Commission AS float) / CAST(Premium AS float) AS FLODIV
FROM
_ROUNDERROR
退貨
--------- ------------ -------- ----------------------- -------------------
| Premium | Commission | RAWDIV | DECDIV | FLODIV |
--------- ------------ -------- ----------------------- -------------------
| 1632.33 | 408.08 | 0.2499 | 0.2499984684469439390 | 0.249998468446944 |
| 408.08 | 163.23 | 0.3999 | 0.3999950990001960399 | 0.399995099000196 |
--------- ------------ -------- ----------------------- -------------------
(當然,如果您支付傭金,922,337,203,685,477我可能想要一份取決于貨幣的作業)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/407385.html
標籤:
下一篇:僅當所有條件都滿足時才回傳結果
