10 진수 시간 초과 근무를 계산하는 작은 소프트웨어를 C#으로 만들었습니다. 나는 항상 가장 가까운 1/10 시간으로 반올림되도록 디자인했다. 내가 가지고있는 문제는 정확하게 2 시간 12 분 또는 3 시간 12 분인 시간을 계산하려고 할 때 잘못된 결과를 얻는다는 것입니다. 관련 코드는 다음과 같습니다TimeSpan 계산 오류
DateTime start = new DateTime(
dtpDateStart.Value.Year,
dtpDateStart.Value.Month,
dtpDateStart.Value.Day,
dtpTimeStart.Value.Hour,
dtpTimeStart.Value.Minute,
0);
DateTime end = new DateTime(
dtpDateEnd.Value.Year,
dtpDateEnd.Value.Month,
dtpDateEnd.Value.Day,
dtpTimeEnd.Value.Hour,
dtpTimeEnd.Value.Minute,
0);
TimeSpan subtotal = end - start;
double subtotalRounded = subtotal.TotalHours;
subtotalRounded = (Math.Floor(subtotalRounded * 10)/10);
dtpDateStart
, dtpTimeStart
, dtpDateEnd
및 dtpTimeEnd
가 승리 양식 프로젝트의 모든 날짜 시간 선택기 컨트롤입니다.
이 코드를 디버깅 할 때 반환 값이 subtotalRounded
인 경우 2.2 및 3.2 대신 2.1999999999999997 또는 3.1999999999999997입니다. 이 값은 4 시간 12 분 이상 또는 1 시간 12 분 이하의 값으로는 발생하지 않습니다.
어쨌든, 왜이 두 값만 반올림 오류가 발생하는지 완전히 왜곡되었습니다. 누구든지 제안이나 의견이 있습니까? 방법을 잘못 사용하고 있습니까? 아니면이를 수행하는 더 좋은 방법이 있습니까?
이것은 부동 소수점 "오류"(의도적 인 인용 부호)처럼 보입니다.반올림 문제 (특히 소수점 이하 자릿수)를 원하지 않는 경우 : double을 사용하지 마십시오. 몇 분 (또는 초 또는 원하는 정밀도)으로 정수로 작업하거나, 십진법은 다음과 같습니다. 분 (초, 무엇이든)에서 십진수로 변환 –