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