2012-07-19 5 views
2

최대 값과 소수 자릿수를 지정할 수있는 RandomDecimal 함수를 만듭니다. 그러나 선택한 마지막 임의의 숫자가 0 일 경우 해당 숫자는 삭제되고 정밀도는 해제됩니다. 이 제로를 잃지 않는 것이 가능한가? 나는 그것을 문자열로 변환 한 다음 십진수로 다시 변환하려고 시도했지만 여전히 삭제됩니다.C#에서 십진수로 후행 0을 버리지 않도록 만드는 방법은 무엇입니까?

public static decimal RandomDecimal(int maxValue, int precision) 
    { 
     decimal result = new Random().Next(maxValue); 

     if (maxValue == 0) 
     { 
      return result; 
     } 

     int i = 1; 

     decimal digit = 0; 

     while (i <= precision) 
     { 
      digit = new Random().Next(10); 
      digit = (digit/(Convert.ToDecimal(Math.Pow(10, i)))); 
      result = result + digit; 
      i++; 
     } 

    // if (digit == 0) 
    // { 
    //  string resultstring = Convert.ToString(result) + '0'; 
    //  result = Convert.ToDecimal(resultstring); 
    //  } This code doesn't do anything because the zero is still dropped. 

     return result; 
    } 
+2

이러한 종류의 '정밀도'는 문자열로 변환 할 때만 존재합니다. –

+0

@HenkHolterman 사실이 아닙니다. 이는 기존 C# 데이터 유형에도 적용되지만 개념적으로 문자열이 아닌 숫자는 "정밀도"를 가질 수 있습니다. – Servy

+0

저는 십진수에 관해 구체적으로 이야기하고있었습니다. 소수 자릿수는 기록하지 않습니다. –

답변

4

당신은 값뿐만 아니라,하지만 당신이 double/float/decimal보다 다른 것을 사용하는 것이 더 낫다 얼마나 많은 유효 숫자 알고있는 숫자의 표현을합니다. 값과 SignificantDigits 속성을 모두 포함하는 고유 한 유형을 만들고자 할 것입니다.

정보를 원하는 경우 decimal은 (는) 사용자가 사용하도록 설계되지 않았습니다. 특정 상황 (앞뒤에 0이없는 곳)에서는 [decimal] 정보를 알지 못하더라도 우연히 같은 결과가 발생하지만 문제를 해결하는 것은 중요하지 않습니다.

+1

Decimal에 대한 MSDN 설명에 따르면 사실이 아닙니다. – MNGwinn

+0

@MNGwinn 데이터를 사용할 수 없거나 공용 인터페이스에 의해 변경할 수있는 구현 세부 사항 (모든 구조 비트를 직접 가져 오거나 설정하는 것 이상)은 알 수 있습니다. 이 때문에 십진수를 사용하는 것이 가능하다고해도 매우 어려울 수 있으므로 새로운 유형을 만드는 것이 가장 좋습니다. 이렇게하면 특정 값의 정밀도를 쉽게 얻거나 설정하고, 값에 대해 더하기/곱하기 또는 다른 연산을 수행하고 ('decimal'이 무엇이든간에) 자신의 규칙을 사용하여 결과의 ​​정밀도를 결정할 수 있습니다. – Servy

+0

새로운 유형이 아마도 더 좋은 해결책 일 것입니다. 내 의견은 진술서에 단지 10 진수로 저장되지 않은 데이터를 원한다는 것입니다. – MNGwinn

1

decimal 대신 string을 돌려서 원하는 유형 (내장 유형 포함) 만 수행 할 수 있습니다. 또한 Random 오브젝트를 한 번 선언하고 하나의 메소드 내에서 새로운 오브젝트를 여러 번 작성하지 않아야합니다.

static Random r = new Random(); 
    public static string RandomDecimal(int maxValue, int precision) 
    { 
     decimal result = r.Next(maxValue); 

     if (maxValue != 0) 
     { 
      int i = 1; 

      decimal digit = 0; 

      while (i <= precision) 
      { 
       digit = r.Next(10); 
       digit = (digit/(Convert.ToDecimal(Math.Pow(10, i)))); 
       result = result + digit; 
       i++; 
      } 
     } 
     var sb = new StringBuilder("0."); 
     sb.Append('0', precision); 
     return result.ToString(sb.ToString()); 
    } 
+0

랜덤 오브젝트를 반복해서 생성하는 것에 대한 팁을 보내 주셔서 감사합니다. :) 마음의 뒤쪽에있는 뭔가가 아마도 그것이 최선의 방법이 아니라고 말하고있었습니다. –

1

소수점 저장 구조체 (10) 내부 According to MSDN의 전력으로서 스케일링 팩터,

스케일링 인자는 또한 소수 번호 후행 제로를 보존한다. 후행 0은 산술 또는 비교 연산의 10 진수 값에 영향을주지 않습니다. 그러나 적절한 형식 문자열이 인 경우 ToString 메서드에 의해 표시된 후행 0은 이 될 수 있습니다.

그것은 바로 마지막 인수로 배율 인수를 취하는 Decimal (Int32, Int32, Int32, Boolean, Byte) 생성자를 사용하여 제외하고, 스케일링 계수를 설정 할 수있는 방법이 있다고 나에게 분명 아니다. 따라서 이론적으로, 당신은 그 생성자로 십진수를 생성함으로써 중요한 후행 0을 가진 십진수를 생성 할 수 있습니다.

+0

그냥 내 코드를 실행하고 이것은 사실 올바른 ... 십진수는 숫자가 없지만 일단 문자열로 변환하면 숫자가 다시 나타납니다. 당신의 도움을 주셔서 감사합니다! 문자열로 변환하지 않고 표시 할 수있는 방법이 있었으면 좋겠지 만 이는 내 용도로 충분합니다. –

+0

나는 답을 선택하는 콤보를 할 수 있으면 좋겠다. lol –

+0

어느 정도까지 할 수 있습니다. 여러 답변을 upvoting하고 최고의 답변을 선택하는 것을 막을 수있는 방법은 없습니다. – MNGwinn