翻譯|行業資訊|編輯:胡濤|2024-11-13 10:07:18.040|閱讀 93 次
概述:這個標題簡潔明了,能夠準確表達文章內容的核心,即討論 .NET 和 .NET Core 3.0 在浮點計算上的變化以及如何應對這些差異。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在 .NET Core 3.0 中,對浮點解析和格式進行了更改,以符合 IEEE 754-2008 標準。您可以閱讀有關這些更改的更多信息。在使用 Stimulsoft 產品時,這些更改最常表現為舍入數字和出現“負號”零。
Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于創建報表和儀表板的通用工具集。該產品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他環境的完整工具集。無需比較產品功能,Stimulsoft Ultimate包含了所有內容!
負號零和正號零在數學分析中用作負無窮小量和正無窮小量的常規符號。在典型的編程任務中,常規零就足夠了,但一些高級數學計算需要這些區別。為了解決這個問題,引入了“負號零”。
負零是四舍五入負數的結果。例如,以前,Math.Round(-0.01, 0)的結果為“0”,但現在為“-0”。在格式化數字(數字、貨幣、百分比格式)時也會出現這種情況,因為在格式化過程中使用了四舍五入。從數學上講,這種方法更準確。然而,從編程的角度來看,這被認為是一個“重大變化”,因為四舍五入操作的標準行為已經改變,并且沒有直接的方法來禁用這種修改。
為了解決出現負零的問題,我們修改了 .NET Core 系列產品,默認情況下,負號零被替換為常規零。但是,如果您的計算仍然需要負零,則可以通過設置StiOptions.Engine.AllowNegativeZero = true選項來啟用它。
.NET Core 3.0 中的一項改進涉及對浮點數語法分析的更改。這種改進的原因在于數字在 float 和 double 類型中的存儲方式。這些數字以二進制形式存儲,僅在四舍五入或顯示在屏幕上時轉換為十進制。例如,數字“0.0045”實際上以“0.00449999999999999996”之類的形式存儲在內存中。然后,在顯示時,一種特殊的方法會從此二進制表示形式“恢復”原始數字。因此,不可能用 float 和 double 類型精確表示十進制數 - 它們總是會包含一定程度的誤差。以前
,這些數字轉換的算法與 IEEE 754-2008 標準中指定的算法不同,這導致不同系統上的計算結果不同。現在,隨著 .NET Core 3.0 中的更新,計算結果符合標準。但是,與早期版本相比,這可能會導致不同的結果,這也會影響標準 Round 函數,可能產生與以前不同的結果。
這給一些同時維護 .NET Framework 和 .NET Core 版本產品的客戶帶來了問題,因為他們現在看到兩個版本的結果不同。請注意!
為確保計算結果在不同環境中一致且可預測,我們建議使用以下方法:在所有關鍵計算中,將類型轉換為十進制。這將保證準確的舍入并最大限度地減少任何計算中的錯誤。修改多個報告很容易,但有些用戶遇到需要重新制作許多以前創建的報告的情況。針對這種情況,我們添加了一個新選項:
StiOptions.Engine.ForceConversionToDecimalInTextFormat = false;
默認情況下,此選項處于禁用狀態。如果將其設置為 true,則在以“數字”、“貨幣”和“百分比”格式格式化文本時,浮點數和雙精度參數將自動轉換為十進制,以提高舍入精度。
要實現銀行舍入,您需要使用標準Math.Round函數中的MidpointRounding.AwayFromZero參數。為了方便起見,我們之前已將此參數添加到我們的自定義Round函數中。根據用戶請求,我們還可以設置此參數的默認值,這樣您就不必更新所有報告模板。為此,您可以配置以下選項:
StiOptions.Engine.MidpointRounding = MidpointRounding.AwayFromZero;
通過使用上述選項,您可以管理計算準確性并避免將產品遷移到 .NET 時出現的潛在問題。想要了解Stimulsoft Reports 報價信息的朋友,歡迎咨詢。
加入官方社群 740060302,歡迎相互交流
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn