Sdílet prostřednictvím


Maximální přesnost pro řetězce číselného formátu

Maximální přesnost při formátování čísel jako řetězců a ToStringTryFormat byla změněna z Int32.MaxValue 999 999 999 999. (Maximální přesnost byla dříve změněna na Int32.MaxValue v .NET 6.)

Kromě toho je maximální povolený exponent při analýze BigInteger řetězce omezen na 999 999 999 999.

Předchozí chování

V .NET 6 byla standardní logika analýzy číselného formátu omezena na přesnost Int32.MaxValue nebo méně. Zamýšlené chování bylo vyvolání FormatException jakékoli přesnosti větší než Int32.MaxValue. Kvůli chybě však rozhraní .NET 6 nevyvolá tuto výjimku pro některé takové vstupy. Zamýšlené chování bylo:

double d = 123.0;

d.ToString("E" + int.MaxValue.ToString()); // Doesn't throw.

long intMaxPlus1 = (long)int.MaxValue + 1;
string intMaxPlus1String = intMaxPlus1.ToString();
Assert.Throws<FormatException>(() => d.ToString("E" + intMaxPlus1String)); // Throws.

Kromě toho při analýze BigInteger řetězce nedošlo k žádnému omezení velikosti exponentu.

Nové chování

Od verze .NET 7 podporuje rozhraní .NET přesnost až 999 999 999 999. A FormatException je vyvolán, pokud je přesnost větší než 999 999 999. Tato změna byla implementována v logikě analýzy, která ovlivňuje všechny číselné typy.

double d = 123.0;
Assert.Throws<FormatException>(() => d.ToString("E" + int.MaxValue.ToString())); // Throws.

long intMaxPlus1 = (long)int.MaxValue + 1;
string intMaxPlus1String = intMaxPlus1.ToString();
Assert.Throws<FormatException>(() => d.ToString("E" + intMaxPlus1String)); // Throws.

d.ToString("E999999999"); // Doesn't throw.

d.ToString("E00000999999999"); // Doesn't throw.

Pokud se navíc pokusíte analyzovat exponent BigInteger větší než 999 999 999 999 z řetězce, FormatException vyvolá se chyba.

Zavedená verze

.NET 7

Typ zásadní změny

Tato změna může ovlivnit binární kompatibilitu.

Důvod změny

Chování, které bylo zavedeno v .NET 6, bylo určeno k vyvolání FormatException jakékoli přesnosti větší než Int32.MaxValue. Kvůli chybě však nevyvolala výjimku pro některé vstupy větší než maximum. Tato změna opravuje chybu omezením přesnosti na 999 999 999 999.

Ve většině případů není nutné provádět žádnou akci, protože je nepravděpodobné, že byste ve formátových řetězcích už používali přesnost vyšší než 999 999 999 999.

Ovlivněná rozhraní API

Tato změna byla implementována v logikě analýzy, která ovlivňuje všechny číselné typy.

Viz také