Новый ответ (на новый вопрос)
Хорошо, значит, у вас есть значение 579.99722222222222222222222222
- и вы хотите, чтобы оно было округлено до двух десятичных знаков. Разве 580.00 не является естественным ответом? Это ближе к первоначальному значению, чем 579,99. Похоже, вы, по сути, хотите поведение flooring , но с заданным количеством цифр. Для этого вы можете использовать:
var floored = Math.Floor(original * 100) / 100;
В этом случае вы можете выполнить оба действия за один шаг:
var hours = Math.Floor(dTotal / 36) / 100;
... что эквивалентно
var hours = Math.Floor((dTotal / 3600) * 100) / 100;
Оригинальный ответ (на оригинальный вопрос)
Звучит так, как будто вы, вероятно, получили payTotal
в неподходящей форме для начала:
using System;
class Test
{
static void Main()
{
decimal pay = 2087975.7m;
decimal time = pay / 3600;
Console.WriteLine(time); // Prints 579.99325
}
}
Это проблема:
var payTotal = 2087975.7;
Это присваивает payTotal
переменной double
. Значение, которое вы на самом деле получили, составляет 2087975,69999999995343387126922607421875, а это не то, что вы хотели. Каждый раз, когда вы обнаруживаете, что кастуете от double
до decimal
или наоборот, вы должны волноваться: есть вероятность, что вы где-то использовали неправильный тип. Значения валют должны абсолютно храниться в decimal
, а не double
(и есть другие вопросы о переполнении стека, которые говорят о том, когда и когда использовать).
См. Две мои статьи о числах с плавающей запятой для получения дополнительной информации:
(Как только вы получите правильные результаты, их форматирование, конечно, другое дело, но это не должно быть слишком плохо ...)