Thanks for that heads up, also:
(decimal)0.1f
0.100000001490116119384765625Wow, what a vicious footgun. I do a lot of work related to pricing, invoicing, exchange rates etc... where decimals do matter, so this kind of stresses me out. Thanks for the heads up.
You shouldn’t cast from double to decimal anyway. Just use decimal throughout.
Yeah, while I do agree this change in behavior could be a major footgun for a few people, the vast majority of use cases for decimal should be unaffected. Decimal is usually used for business applications to the exclusion of double/float, not alongside them (the only doubles I've seen in my company's applications are just storing Lat/Long values for addresses, everything else uses decimal values).
Hell, on the rare occasion I've needed to use a decimal literal in code, I just use a decimal literal: don't do (decimal)0.1, just use 0.1m.
Re:What's new in the .NET 11 runtime
by FearNotDaniel on Tuesday November 10, 2026 @03:01PM
(#50445521)
Exactly. If you want an actual decimal literal you should always write it as 1.2345m rather than converting it with the (decimal) prefix. The compiler refuses to accept a plain 1.2345 assigned to a decimal type so it’s not such a footgun as it may appear to some; though it might offer a better DX if the type of the literal was inferred from the thing you are trying to assign it to, that would no doubt have unintended consequences.
Fair enough, this is mostly what i do but since the runtime has been forgiving, i'll need to triple check that. I label all pure money fields as decimal, but am less confident for the ProductQuantity kind of fields. I typically use int for whole numbers but wouldn't be surprised if i used float occasionnally for quantities accepting decimals.
Re:What's new in the .NET 11 runtime
by bazoom42 on Wednesday November 11, 2026 @03:44AM
(#50451060)
In cases where you have to convert from float/double to decimal you should use an explicit rounding method, not just a raw cast.
> don't cast from double to decimal
I hope this is a compiler warning at the least.
Re:What's new in the .NET 11 runtime
by tomalbrc on Wednesday November 11, 2026 @01:51PM
(#50456995)
It is an error if you dont explicitly cast: https://learn.microsoft.com/en-us/dotnet/csharp/language-ref...
A cast is the programmer saying “i know more than the compiler”. If you dont, dont use cast.
Re:What's new in the .NET 11 runtime
by Dylan16807 on Wednesday November 11, 2026 @10:31PM
(#50462723)
The code (decimal)0.1 shouldn't involve a double in the first place.
The literal 0.1 is a double. If you want a decimal literal use the “m” postfix like 0.1m.
Re:What's new in the .NET 11 runtime
by Dylan16807 on Thursday November 12, 2026 @01:13PM
(#50471603)
> The literal 0.1 is a double.
I know. It shouldn't be.
Why? What do you mean?
Re:What's new in the .NET 11 runtime
by kevin_thibedeau on Tuesday November 10, 2026 @07:32PM
(#50448299)
0.1 is not representable in binary floating point. The old behavior was adding magic that shouldn't be there.
Did they deprecate it, then?
Re:What's new in the .NET 11 runtime
by ExoticPearTree on Wednesday November 11, 2026 @03:49AM
(#50451088)
> Wow, what a vicious footgun.
We do too at $dayjob, but use cents for everything and at the end of the calculation we divide by 100 to get the dollar amount.
Exchange rates are 4 decimals, so you would still not get bit by this.
Thanks for sharing, this is an interesting approach. Unfortunately, too late for us to transition to this across the board, but I'll definitely keep it in mind moving forward.
Re:What's new in the .NET 11 runtime
by electroglyph on Wednesday November 11, 2026 @06:05PM
(#50460208)
found this one out the hard way, lol. my C# interface for a vector db stumbled into this right off due to how my tests were written
Be aware