public static JsonSerializerSettings NormalizeDecimals(this JsonSerializerSettings settings)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }
            Contract.EndContractBlock();

            JsonConverter?existing         = settings.Converters.FirstOrDefault(c => c is JsonConverter <decimal>);
            var           existingNullable = settings.Converters.FirstOrDefault(c => c is JsonConverter <decimal?>);

            if (existing is JsonDecimalConverter && existingNullable is JsonNullableDecimalConverter)
            {
                return(settings);
            }

            if (existing == null && existingNullable == null)
            {
                return(settings
                       .AddConverter(JsonDecimalConverter.Instance)
                       .AddConverter(JsonNullableDecimalConverter.Instance));
            }

            if (existing != null)
            {
                throw new InvalidOperationException("A specific decimal converter already exists.");
            }

            throw new InvalidOperationException("A specific Nullable<decimal> converter already exists.");
        }
        static JsonSerializerSettings RoundDoublesCore(this JsonSerializerSettings settings, int maxDecimals)
        {
            var existing = settings.Converters.FirstOrDefault(c => c is JsonConverter <double>);

            if (existing == null)
            {
                return(settings.AddConverter(new JsonDoubleRoundingConverter(maxDecimals)));
            }
            if (existing is JsonDoubleRoundingConverter e && e.Maximum == maxDecimals)
            {
                return(settings);
            }
            throw new InvalidOperationException("A specific double converter already exists.");
        }
        static JsonSerializerSettings RoundNullableDecimalsCore(this JsonSerializerSettings settings, int maxDecimals)
        {
            JsonConverter?existing = settings.Converters.FirstOrDefault(c => c is JsonConverter <decimal?>);

            if (existing is JsonNullableDecimalConverter && existing.GetType() == typeof(JsonNullableDecimalConverter))
            {
                settings.Converters.Remove(existing);
                existing = null;
            }
            if (existing == null)
            {
                return(settings.AddConverter(new JsonNullableDecimalRoundingConverter(maxDecimals)));
            }
            if (existing is JsonNullableDecimalRoundingConverter e && e.Maximum == maxDecimals)
            {
                return(settings);
            }
            throw new InvalidOperationException("A specific Nullable<decimal> converter already exists.");
        }