TimeSpan округляет до 3 десятичных позиций - PullRequest
4 голосов
/ 23 апреля 2020

Для следующей строки:

decimal sec = (decimal)TimeSpan.FromMilliseconds(.8).TotalSeconds;

Я ожидаю se c = 0,0008, но округляется до 3 десятичных позиций и дает результат как 0,001, любые обходные пути.

1 Ответ

8 голосов
/ 23 апреля 2020

Согласно документы , FromMilliseconds округляются до ближайшей миллисекунды:

Следовательно, значение будет считаться точным только с точностью до ближайшей миллисекунды.

Обратите внимание, документы правильны только для. NET Framework. . NET Core 3.x будет работать так, как надеялся OP (возвращает 0,0008, в отличие от документов).

Если вы хотите, чтобы это работало в. NET 4.x - рассмотрите возможность умножения миллисекунд на 10 000 (TicksPerMillisecond), а затем вызовите FromTicks (или конструктор) вместо FromMilliseconds:

using System;

public class Program
{
    public static void Main()
    {
        var ticksPerMillisecond = TimeSpan.TicksPerMillisecond;
        decimal sec = (decimal)TimeSpan.FromMilliseconds(.8).TotalSeconds;
        decimal sec2 = (decimal)TimeSpan.FromTicks((long)(0.8 * ticksPerMillisecond)).TotalSeconds;
        decimal sec3 = (decimal)new TimeSpan((long)(0.8 * ticksPerMillisecond)).TotalSeconds;

        Console.WriteLine(sec);  
        // 0.0008  .NET Core 
        // 0.001   .NET Framework
        Console.WriteLine(sec2);
        // 0.0008  .NET Core
        // 0.0008  .NET Framework 
        Console.WriteLine(sec3);
        // 0.0008  .NET Core
        // 0.0008  .NET Framework

    }
}

Этот пост в блоге читается дальше проблема. Скрипка доступна в https://dotnetfiddle.net/YfIFjQ.

...