모든 코드의 간단한 라인을 시작했다 소수 구분 후 2 자리와 두 배로. d는 1689.9999999999998과 같습니다. 소수 자릿수 뒤에 2 자리 숫자로 double 값을 반올림하면됩니다. 내 기능은 다음과 같습니다. 변환 문자열은
private double RoundFloat(double Value)
{
float sign = (Value < 0) ? -0.01f : 0.01f;
if (Math.Abs(Value) < 0.00001) Value = 0;
string SVal = Value.ToString();
string DecimalSeparator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
int i = SVal.IndexOf(DecimalSeparator);
if (i > 0)
{
int SRnd;
try
{
// вземи втората цифра след десетичния разделител
SRnd = Convert.ToInt32(SVal.Substring(i + 3, 1));
}
catch
{
SRnd = 0;
}
if (SVal.Length > i + 3)
SVal = SVal.Substring(0, i + 3);
//SVal += "00001";
try
{
double result = (SRnd >= 5) ? Convert.ToDouble(SVal) + sign : Convert.ToDouble(SVal);
//result = Math.Round(result, 2);
return result;
}
catch
{
return 0;
}
}
else
{
return Value;
}
그러나 다시 내가 원하는대로 작동하지 않는 두 배로 문자열로 변환 같은 문제,
. 이 문제를 해결하려면 "00001"을 문자열에 연결 한 다음 Math.Round 함수를 사용하십시오 (위의 예제에서 주석 처리 됨).이 두 값에 100을 곱한 값 (정수)은 장치 (금전 등록기)로 전송되며이 값은 정확해야합니다. 내가 VS2005 + .NET CF를 사용하고
2.0
다른 많은 "우아한"해결책은 나는이 일에 만족하지 않다,이입니다.
또 다른 일, 다른 사람은 그것으로 실행하는 매우 일반적인 일이 – leppie
부동 소수점에 실패, 그래서 몇 가지 중복이있을 바인딩 이 사이트에서.하지만 난 그냥 대답하기보다는 그들을 찾는 더 노력이라고 생각해. :) –
. 내가 봤던 기억 나는 확실하지. 그것은 너무 중복 질문처럼 보인다 :( – Joren