動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石6: decimalがdoubleに化ける問題と対策

出典: C# Newtonsoft.Json で業務系JSON処理を実戦投入する完全ガイド(.NET Framework 4.7.2 編)定石6: decimalがdoubleに化ける問題と対策

定石6: decimalがdoubleに化ける問題と対策 (csharp)#4e944e9ff5db
// ❌ NG: JObject経由でdouble化け(金額計算が事故る)
string apiResponse = "{\"amount\": 12500.10}";
var jobj = Newtonsoft.Json.Linq.JObject.Parse(apiResponse);
 
double amountDouble = (double)jobj["amount"];   // 12500.099999999...の罠
decimal amountFromDouble = (decimal)amountDouble;  //既にdouble化けしてる
 
// ✅ OK 1: JObjectから直接decimalキャスト
decimal amountDirect = (decimal)jobj["amount"];   //正確に12500.10
 
// ✅ OK 2: FloatParseHandling.Decimal設定
var settings = new JsonSerializerSettings
{
    FloatParseHandling = FloatParseHandling.Decimal,
};
string s = "[12500.10, 998.50, 0.1]";
var values = JsonConvert.DeserializeObject<decimal[]>(s, settings);
 
// ✅ OK 3:型付きクラスに直接デシリアライズ(業務系の本命)
public class PaymentDto { public decimal Amount { get; set; } }
var payment = JsonConvert.DeserializeObject<PaymentDto>(apiResponse);
// → payment.Amountは12500.10のまま、化けない
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
  • id: #4e944e9ff5db
  • lines: 22
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「定石6: decimalがdoubleに化ける問題と対策」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

5
C#
// ✅定石1:最小シリアライズ・デシリアライズ
using Newtonsoft.Json;

public class OrderDto
▶ 実行可

定石1: NuGetでNewtonsoft.Jsonを入れる+最小コード

#ebd2150a39f0
C#
// ✅定石2:業務系ベース設定(プロジェクト全体で使い回す)
public static class JsonConfig
{
    public static readonly JsonSerializerSettings BusinessDefault = new JsonSerializerSettings
未収録

定石2: JsonSerializerSettingsで業務系ベース設定を固定

#724e2bb51ad5
C#
// ❌ NG:既定設定でKind=Localをシリアライズすると、ローカル時刻が出力される
var bad = new { CreatedAt = DateTime.Now };  // Kind=Local
string badJson = JsonConvert.SerializeObject(bad);
// → {"CreatedAt":"2026-05-09T14:00:00+09:00"}  ← JST環境のローカル時刻
未収録

定石3: DateTimeのUTC統一で時刻ズレを潰す

#4610d44165e1
C#
// ✅定石4:金額用カスタムJsonConverter(書き出し時に円マーク付与など)
public class MoneyJsonConverter : JsonConverter<decimal>
{
    public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer)
未収録

定石4:カスタムJsonConverter —業務固有型の専用変換

#90fd64ac232b
C#
// ✅定石5: JsonTextReaderで巨大JSONをストリーミング読み込み
using (var fs = new FileStream(jsonFilePath, FileMode.Open, FileAccess.Read))
using (var sr = new StreamReader(fs))
using (var reader = new JsonTextReader(sr))
未収録

定石5: JsonTextReaderでストリーミング読み込み

#15abeba39934
図鑑トップ