2016-09-12 8 views
0

私のコードでは、ほぼ8つの小数点以下の変数を使用しています。 Double変数型の丸めの問題のために、正しい結果を得るためには、すべての計算の後にx = Math.Round(x、8)を使用する必要があります。カスタムデータ型 - 暗黙的な変換と演算演算子の機能を追加する方法

変数型のクラスを使用して小数点以下8桁をサポートすることができましたが、.varクラスプロパティを使用してすべてのインスタンスを参照する必要があります。

これを実装するより良い方法はありますか? 1は、暗黙的な変換と割り当ての面で固有のデータ型とは、実行と同じように、私が何をしたいのか

Public Class Double8 
     Private localval As Double 
     Public Sub New() 
      localval = 0 
     End Sub 
     Property var As Double 
      Get 
       Return localval 
      End Get 
      Set(value As Double) 
       localval = Math.Round(value, 8) 
      End Set 
     End Property 
End Class 

'Test rounding from below, at and above .....5 
Dim n As New Double8 
n.var = 0.123456789 
MsgBox("0.123456789 stored as " & n.var.ToString) 
n.var = 0.123456782 
MsgBox("0.123456782 stored as " & n.var.ToString) 
n.var = 0.123456785 
MsgBox("0.123456785 stored as " & n.var.ToString) 

は同じようにタイプDouble8を使用している基本的な数学演算(乗算、除算、加算、減算)と型なしの型は、型のvarプロパティを参照する必要があります。

+1

これは限りスタックオーバーフローの定義が行くように、本当に問題ではありません。コードレビューの姉妹サイトを試してみることもできますか? – brichins

+1

'Decimal'はどうですか? –

答えて

1

Double8タイプの変換演算子と数学演算子の両方を定義できます。私はあなたのDouble8を構造に変換しました。なぜなら、特別な場合であるDoubleを表す何らかの意味があるからです。私はDoubleへの変換と、Doubleによる加減算を実装しました。他の演算子は、実装するまであなたに任されています。

Public Structure Double8 
    Private localval As Double 

    Property var As Double 
     Get 
      Return localval 
     End Get 
     Set(value As Double) 
      localval = Math.Round(value, 8) 
     End Set 
    End Property 

    Public Shared Widening Operator CType(d As Double) As Double8 
     Return New Double8 With {.var = d} 
    End Operator 

    Public Shared Widening Operator CType(d8 As Double8) As Double 
     Return d8.var 
    End Operator 

    Public Shared Operator +(d8 As Double8, d As Double) As Double 
     Return d8.var + d 
    End Operator 

    Public Shared Operator -(d8 As Double8, d As Double) As Double 
     Return d8.var - d 
    End Operator 
End Structure 

変換演算子(CType)はタイプ間の割り当てを可能にします。 Dim d8 As Double8 = 1.123456789#

他の演算子(数学と論理)は、方程式であなたの型を使用できるようにします。

Dim d1 As Double = 5.0 + d8 
Dim d2 As Double8 = d8 - 5.0 

参照:

How to: Define a Conversion Operator (Visual Basic)

How to: Define an Operator (Visual Basic)

+0

すごいよ、私はこの方法を知らなかった –

関連する問題