現在、VB5をやっているのですが、以前の質問のログを見てさらに思ったのですが、乗除算で
Double型で15桁や通貨型などで、有効桁数より大きな数(20桁)等を計算して、正しい数値を
表すには(指数ではなくて)何かいい方法があるのですか?
999,999,999,999,999 * 10 などの計算です。

このQ&Aに関連する最新のQ&A

計算 log」に関するQ&A: logの計算です。

A 回答 (2件)

再度田吾作7です。



これを実行してみてください。

'バリアントで宣言
Dim wkDecimal As Variant
'10進型でセット
wkDecimal = CDec(999999999999999# * 9999999#)
'イミディエイトウィンドウへ出力
Debug.Print wkDecimal


Dim の所でDecimal(10進型)で宣言したいところですが、それは出来ないようです。ですのでバリアント型で宣言しておき、値をセットするタイミングで10進型にしてあげます。するとバリアントのwkDecimalは、内部で10進型の変数になります。
偶然的に見つけたものですから、詳しく実験はしておりません。。。

でわでわ
    • good
    • 0

どもども田吾作7です。



('_`)ウゥ 計算は標準で有効桁数が限られているので、標準では出来ないと思います。(もし出来るのであれば、ぼくも知りたいです。だれか教えて!)

ぼくの場合は自分で計算モジュールを作っちゃいます。


一応たし算とかけ算のサンプルを載せておきます。

そういえば、この前別の質問に答えて、サンプルを参考URLに載せたら、gooの人から「直接リンクを張ってはいけない」とメールが送られてきて、しかもその発言を削除されてしまいました。。。(-ロ-;グハッ
どうやら、いけない行動だったらしいのです。ですので、ここにアドレスを書いときます。(ここならOKなのかな?)

http://f-ga.com/Lib/CalcProject.lzh
以下のソースは上記のファイルのソースを、コピペしたものです。


必要なコントロール
Command1
Text1
Text2
Label1

Command2
Text3
Text4
Label2


Private Sub Command1_Click()
'たし算
Dim wkStr As String
Dim wkLng As Long

With Me
'テキスト1には数値が長くても大丈夫
wkStr = .Text1.Text

'テキスト2にはLONG型に収まる値にしてください
wkLng = Val(.Text2.Text)

.Label1 = funcTASU(wkStr, wkLng)
End With
End Sub

Private Sub Command2_Click()
'かけ算
Dim wkStr As String
Dim wkLng As Long

With Me
'テキスト3には数値が長くても大丈夫
wkStr = .Text3.Text

'テキスト4にはLONG型に収まる値にしてください
wkLng = Val(.Text4.Text)

.Label2 = funcKAKERU(wkStr, wkLng)
End With
End Sub


Function funcTASU(inStrNumber As String, inLngPlusNumber) As String
Const CutNum As Long = 3 'とりあえず3桁で区切ることにする

Dim wkMaxLen As Long '文字型ナンバーの桁数
Dim wkMaxCnt As Long 'ループ回数
Dim wkMod As Long '3桁にならない余りの上位桁
Dim i As Long 'ループカウンタ
Dim wkSpotPos As Long '区切り位置

Dim wkSpotNum As Long '区切られた部分の数値

Dim wkCalc As Long '計算用ワーク


Dim memCalc As String '計算用ワーク
Dim ketaCalc As Long '桁上がり計算用ワーク


If Not IsNumeric(inStrNumber) Then GoTo PGMEND

wkMaxLen = Len(inStrNumber)
'この回数繰り返す
wkMaxCnt = (wkMaxLen \ CutNum)

'3で割り切れない桁数を得る
wkMod = (wkMaxLen Mod CutNum)

'余りがあるとき、ループ数を増やす
If Not (wkMod = 0) Then
wkMaxCnt = wkMaxCnt + 1
End If


For i = 1 To wkMaxCnt
'基本的に3桁づつ取り出す
If (i = wkMaxCnt) And (Not (wkMod = 0)) Then
'最上位桁が3桁じゃない時、上位余り桁を得る
wkSpotNum = Left(inStrNumber, wkMod)
Else
'それ以外
wkSpotPos = (wkMaxLen - (i * CutNum) + 1)
wkSpotNum = Mid(inStrNumber, wkSpotPos, CutNum)
End If

If i = 1 Then
'最下位桁には指定の値をたす
wkCalc = inLngPlusNumber + wkSpotNum
Else
'最下位桁以外は、繰り上がりの値をたす
wkCalc = wkSpotNum + ketaCalc
End If

'上位桁として下3桁だけ連結させる
memCalc = Right(wkCalc, CutNum) & memCalc

'10の3乗で除算し、その答えが桁上がり
ketaCalc = wkCalc \ (10 ^ CutNum)
Next i

'桁上がりが存在していたら、上位桁として連結
If Not (ketaCalc = 0) Then
memCalc = ketaCalc & memCalc
End If

PGMEND:
'返り値をセット
funcTASU = memCalc
End Function


Function funcKAKERU(inStrNumber As String, inLngKakeruNumber) As String
Const CutNum As Long = 3 'とりあえず3桁で区切ることにする

Dim wkMaxLen As Long '文字型ナンバーの桁数
Dim wkMaxCnt As Long 'ループ回数
Dim wkMod As Long '3桁にならない余りの上位桁
Dim i As Long 'ループカウンタ
Dim wkSpotPos As Long '区切り位置

Dim wkSpotNum As Long '区切られた部分の数値

Dim wkCalc As Long '計算用ワーク


Dim memCalc As String '計算用ワーク
Dim ketaCalc As Long '桁上がり計算用ワーク


If Not IsNumeric(inStrNumber) Then GoTo PGMEND

wkMaxLen = Len(inStrNumber)
'この回数繰り返す
wkMaxCnt = (wkMaxLen \ CutNum)

'3で割り切れない桁数を得る
wkMod = (wkMaxLen Mod CutNum)

'余りがあるとき、ループ数を増やす
If Not (wkMod = 0) Then
wkMaxCnt = wkMaxCnt + 1
End If


For i = 1 To wkMaxCnt
'基本的に3桁づつ取り出す
If (i = wkMaxCnt) And (Not (wkMod = 0)) Then
'最上位桁が3桁じゃない時、上位余り桁を得る
wkSpotNum = Left(inStrNumber, wkMod)
Else
'それ以外
wkSpotPos = (wkMaxLen - (i * CutNum) + 1)
wkSpotNum = Mid(inStrNumber, wkSpotPos, CutNum)
End If


'とりあえずかける
wkCalc = inLngKakeruNumber * wkSpotNum

'繰り上がりの値をたす
wkCalc = wkCalc + ketaCalc

'上位桁として下3桁だけ連結させる
memCalc = Right(wkCalc, CutNum) & memCalc

'10の3乗で除算し、その答えが桁上がり
ketaCalc = wkCalc \ (10 ^ CutNum)

Next i

'桁上がりが存在していたら、上位桁として連結
If Not (ketaCalc = 0) Then
memCalc = ketaCalc & memCalc
End If

PGMEND:
'返り値をセット
funcKAKERU = memCalc
End Function


ってな感じです。

でわでわ
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q小学生算数 「上から2けた」の考え方

小学生算数 「上から2けた」の考え方

お世話になります。
数学のカテゴリで恐縮ですが、小学生の子供に算数を教えていてわからなかったので教えてください。
答えを上から2けたのおよその数で答えなさい、というときに、計算結果が0.536になった場合は、小数第1位を上から1けた目と考えて、小数第3位の6を四捨五入して0.54とすればよいのでしょうか?
1のくらいの「0」を1けた目と数えていいのかどうか、わからなくて質問させていただきました。よろしくお願いいたします。

Aベストアンサー

小数の場合、「上から?桁」はゼロを無視して数えます。

例)0.00829の上から2桁の概数 → 0.0083

Q4桁の数字を A*1000+B*100+C*10+D 以外で表現したい。

A=1
B=2
C=3
D=4

のとき 
1234をA*1000+B*100+C*10+D以外で表現したいのですが
何かいい方法がないでしょうか?
4桁ならいいんですが
15、6桁を10行ぐらいコーディングしないといけないのでなえてます↓助けてください。

Aベストアンサー

No.4です。

VB2005でも問題なくできますよ。実際に確認済みです。

Dim A As Integer = 1
Dim B As Integer = 2
Dim C As Integer = 3
Dim D As Integer = 4
Dim E As integer

E = (A & B & C & D) * 1
MsgBox(E)

これで試してください。

Q小学生の算数問題です

子どもが塾で出された課題です。
「0から9までの数字を1回づつ使用して、4けた+2けた=4けたの式が成り立つものをすべたあげなさい。」
4通りは発見できたのですが、はたして全部で何通りあるかもわかりません。
どなたか助けて下さい。

Aベストアンサー

ABCD+EF=GHIJ とすれば、
B=9
H=0
A+1=G

また、各桁の偶奇を調べると、
偶+偶=偶、偶+奇=奇、奇+奇=偶
なので、繰り上がりを考えないと、奇数の数は偶数個でなければなりません。
0~9のうち奇数は5個なので、繰り上がりしている桁は奇数個あることになります。
2桁目、3桁目は繰り上がりしているので、1桁目も繰り上がりしています。

以上のことを踏まえて、
CとE、DとFは交換しても和は同じなので、C>E、D>Fとして、
2桁目の組み合わせを調べると、
A92D+8F=G01J (3,4,5,6,7)
A93D+7F=G01J (2,4,5,6,8)
A93D+8F=G02J (1,4,5,6,7)
A94D+6F=G01J (2,3,5,7,8)
A94D+7F=G02J (1,3,5,6,8)
A94D+8F=G03J (1,2,5,6,7)
A95D+6F=G02J (1,3,4,7,8)
A95D+7F=G03J (1,2,4,6,8)
A95D+8F=G04J (1,2,3,6,7)
A96D+7F=G04J (1,2,3,5,8)
A96D+8F=G05J (1,2,3,4,7)
A97D+8F=G06J (1,2,3,4,5)
の12通り。(括弧内は残りの数字)

さらにそれぞれの組み合わせを調べると、

4926+87=5013
5934+78=6012
5934+87=6021
2947+68=3015
5943+78=6021
1956+78=2034
1956+87=2043
1965+78=2043
2964+87=3051
の9通り。

1桁目、2桁目を交換したものも加えると、合計36通りとなります。

ABCD+EF=GHIJ とすれば、
B=9
H=0
A+1=G

また、各桁の偶奇を調べると、
偶+偶=偶、偶+奇=奇、奇+奇=偶
なので、繰り上がりを考えないと、奇数の数は偶数個でなければなりません。
0~9のうち奇数は5個なので、繰り上がりしている桁は奇数個あることになります。
2桁目、3桁目は繰り上がりしているので、1桁目も繰り上がりしています。

以上のことを踏まえて、
CとE、DとFは交換しても和は同じなので、C>E、D>Fとして、
2桁目の組み合わせを調べると、
A92D+8F=G01J (3,4,5,6,7)
A93D+7F=G01J...続きを読む

Qinteger型、long型、double型

vb6.0についてお聞きいたします。
こちらの問題は、visual studio 2005のvbでは生じません。

windows xp上で動かしているのですが、どうやら
何もしていないあるパラメータに32000ぐらいの数字よりも大きな
数字をいれるとエラーになってしまいます。

それも、integer型、long型、double型のすべての型で生じます。
そういうものなのでしょうか?
HPをいろいろ見ましても、long型で20億ぐらいは
表現できるように書いてあるのですが。

Aベストアンサー

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Explicit

Sub hoge()

Dim a As Long

a = 33000
MsgBox (a)


End Sub
===========================
Option Explicit
Sub hoge2()

Dim a As Double

a = 33000
MsgBox (a)


End Sub
=====================
Option Explicit
Sub hoge3()

Dim a As Integer

a = 33000
MsgBox (a)


End Sub

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Ex...続きを読む

Q小5算数パズルの宿題が解りません。

1から9までの数字を1回ずつ使用し、5けたひく4けたの筆算式を2つ作り、
それぞれの答えが22222と33333になる筆算式を作ります。

     □□□□□
   -  □□□□
     2 2 2 2 2

     □□□□□
   -  □□□□
     3 3 3 3 3 

どうしても解けません。助けてください。

 

Aベストアンサー

回答例です。

31874
9652
22222

41286
7953
33333

Q数値+演算子+数値を計算したい!

数値1+演算子+数値2を計算させたいのですが、1 + 1 のような計算を格納するにはどうしたらいいですか?


数値1 Decimal
数値2 Decimal
演算子 String
結果  Decimal

Decimal = Decimal + String + Decimal だとエラーが出ます。当たり前ですけど・・・

Aベストアンサー

> Eval関数を使って、文字列を渡すと自動計算して結果も何もかもStringで扱いたいと思っています。
> Stringは20億桁ほど扱えるんですよね・・・Decimalより扱える桁が多そうな気がして・・・素人考えですみません。

20億桁を記憶することが出来ても、それで計算することは出来ません。プログラムどうこうというより、コンピュータの構造上不可能です。

DecimalやIntegerなどが扱うのは「数値」、
String型が扱うのは「数字」です。

「数値」は計算することはできますが「数字」は計算できません。

数値とは
12345 が 1万2千3百4十5 という分量です。
一方、数字とは
12345 が「いち」「に」「さん」「よん」「ご」という文字の羅列であり、「数値」を表すための「文字」を並べたものにすぎません。

計算を全てString型でやるということは、不可能ではありませんが非常に効率が低下します。(個人的にはDecimalもNGなんですけども)


あと、Option StrictはOnにしたほうがいいです。今回のケースであれば、Offにする必要はありません。

参照設定でMicrosoft Script Control 1.0が見つからなかったのは、
「COM」タブから探していないからでしょう。
「参照の追加」を開くと[.NET][COM][プロジェクト]・・・とあるはずなので、[COM]を選択し、「Microsoft Script Control 1.0」を探して追加してください。
さらに、コードの次の部分を書き換えます。

[ ScriptControlクラスの作成箇所 ]
Dim js As Object
js = CreateObject("ScriptControl")
  ↓
Dim js As New MSScriptControl.ScriptControl

[ Eval関数の呼び出し箇所 ]
Total = js.Eval(Work) '遅延バインディングを使用できません
  ↓
Total = js.Eval(Work).ToString()

これで遅延バインディング及び暗黙的型変換は発生しなくなるはずです。

> Eval関数を使って、文字列を渡すと自動計算して結果も何もかもStringで扱いたいと思っています。
> Stringは20億桁ほど扱えるんですよね・・・Decimalより扱える桁が多そうな気がして・・・素人考えですみません。

20億桁を記憶することが出来ても、それで計算することは出来ません。プログラムどうこうというより、コンピュータの構造上不可能です。

DecimalやIntegerなどが扱うのは「数値」、
String型が扱うのは「数字」です。

「数値」は計算することはできますが「数字」は計算できません。

...続きを読む

Q小3の算数


1.2.3.4.5.6
1~6までのカードが1まいづつあります。
このカードを使って、
(3けた)-(3けた)の式を作りなさい。
Q1答えが111になる式はなんでしょうか?
 (111になるようにしましょう 答えは6パターンあります)
Q2答えが一番小さくなるのは?


よろしくお願いします。

Aベストアンサー

1
246-135 264-153 426-315 462-351 624-513 642-531
隣り合う数字を引けば1になることに気づく。それをうまくならべる方法。パターンをもれなく数え上げるコツ。こんなところを学ぶ問題でしょうか。

2
ほんとはマイナスの数字がいちばん小さいですが、小3ですからそれは考えないんでしょう。だとすると、

100の位は隣り合う数にすべきだというのをまず思いつく。
で、残りの10の位と1の位の数字で、できるだけ、引かれる方を小さく、引く方を大きくするのがいいなと考えるんでしょう。
そうすると65がいちばんでかくて、12がいちばん小さい。のこりの3と4で100の位を作ろう。

みたいな感じでしょうか。
412-365

Q通貨型はバイト型に変換可能?

構造体に入っている通貨型(Currency)をバイト型に変換したいのですが
思ったように変換されません。
どのように変換すればよいのでしょうか?

--------------------
通貨型を含まない場合
--------------------
Type tpSample
nint1 As Integer ' 2バイト
nInt2 As Integer ' 2バイト
End Type

Sub Main()
Dim LudtpSample As tpSample
Dim LbyteBuff(100) As Byte

With LudtpSample
.nint1 = 1
.nInt2 = 1
End With

' バイト配列にコピー
Call CopyMemory(ByVal VarPtr(LbyteBuff(0)), LudtpSample, Len(LudtpSample))

End Sub

[LbyteBuffの中身]
LbyteBuff(0) = 1
LbyteBuff(1) = 0
LbyteBuff(2) = 1
LbyteBuff(3) = 0


--------------------
通貨型を含む場合
--------------------

' 構造体に通貨型を追加
Type tpSample
nint1 As Integer ' 2バイト
cCur As Currency ' 8バイト?
nInt2 As Integer ' 2バイト
End Type

Sub Main()
Dim LudtpSample As tpSample
Dim LbyteBuff(100) As Byte

With LudtpSample
.nint1 = 1
.cCur = 1
.nInt2 = 1
End With

' バイト配列にコピー
Call CopyMemory(ByVal VarPtr(LbyteBuff(0)), LudtpSample, Len(LudtpSample))

End Sub

[LbyteBuffの中身]
LbyteBuff(0) = 1
LbyteBuff(1) = 0
LbyteBuff(2) = 0
LbyteBuff(3) = 0
LbyteBuff(4) = 16
LbyteBuff(5) = 39
LbyteBuff(6) = 0
LbyteBuff(7) = 0
LbyteBuff(8) = 0
LbyteBuff(9) = 0
LbyteBuff(10) = 0
LbyteBuff(11) = 0
LbyteBuff(12) = 0
LbyteBuff(13) = 0

通貨型を構造体に含めるとバイトがずれていきます。
通貨型はバイト型に変換不可能なのでしょうか?
その場合、構造体にLong型を超えるデータを格納したい場合、通貨型(Currency)を使用する以外の方法がありますでしょうか?

構造体に入っている通貨型(Currency)をバイト型に変換したいのですが
思ったように変換されません。
どのように変換すればよいのでしょうか?

--------------------
通貨型を含まない場合
--------------------
Type tpSample
nint1 As Integer ' 2バイト
nInt2 As Integer ' 2バイト
End Type

Sub Main()
Dim LudtpSample As tpSample
Dim LbyteBuff(100) As Byte

With LudtpSample
.nint1 = 1
.nInt2 = 1
End Wi...続きを読む

Aベストアンサー

> バイト配列にコピー
LenはLenB を使うべし。

>通貨型を構造体に含めるとバイトがずれていきます。

ずれる原因はInteger型を使っているから。
APIに渡す構造体は4の倍数バイトの変数を使用するべし。
IntegerはLongを使うべし。

QACCESSで10桁の中から中の3桁を抜き出す関数

ACCESSで7けたの数値7654321から765の部分3桁と43の部分の2桁、21の桁を分けて抜きとりたいのですが、どういう関数を使ったらよいかわかりません、LEFT関数を使ってみたりしたのですがどうも欲しいものが取り出せないので基礎的なことですが教えてください
よろしくおねがいします

Aベストアンサー

クエリのデザイングリッドの「フィールド」のセルに

a: [x] \ 10000
b: ([x] Mod 10000) \ 100
c: [x]-[a]*10000-[b]*100

と入力してください。ここで、x は 7654321 などが入っているフィールドの名前、a, b, c は計算結果が入るフィールドの名前です。

7654321 に対しては、a に 765、b に 43、c に 21 が得られます。

QSQL文がDouble型として認識される

SQL文がDouble型として認識される

質問させて頂きます。
ユーザーのポイントを引き算し、SQLにアップデートするプログラムを組んでいます。
実行すると

String "UPDATE 「テーブル名」 SET 「要素名(Integer)」 " から型 'Double' への変換は無効です。

というエラーが出るのですが、SQL文の部分を何故Doubleに変換するのでしょうか?
デバッグにて変数を確認し、String等をいれてみても同じエラーが出る上
SQL文は他の部分で正常に動いているものをコピーしても同じエラーが出ます。

INSERT INTO テーブル名(要素) VALUES(xxx)"であれば
「String "INSERT INTO テーブル名(要素) VALUES」 " から型 'Double' への変換は無効です。」
となります。

SQL文の記述が間違っているとは思えず、VBの記述の問題としてここで質問させて頂きました。
コードは以下の通りで、環境はVB2010 + SQL Server2008です。
回答して頂くために不足している情報がありましたらすぐに追記致します。
至らない文章ではありますが、どうかよろしくお願い致します。

Dim point As Integer
point = point(Integer型) - price(Integer型)

Dim strSQL As String = "UPDATE 「テーブル名」 SET 「要素(Int型)」 = '" + point + "' WHERE UserID = '" + userid(String型) + "'"

cn.ConnectionString = My.Settings.ServerURL
Dim cmd4 As New SqlCommand(strSQL, cn)

cn.Open()
cmd4.ExecuteNonQuery()
cn.Close()

SQL文がDouble型として認識される

質問させて頂きます。
ユーザーのポイントを引き算し、SQLにアップデートするプログラムを組んでいます。
実行すると

String "UPDATE 「テーブル名」 SET 「要素名(Integer)」 " から型 'Double' への変換は無効です。

というエラーが出るのですが、SQL文の部分を何故Doubleに変換するのでしょうか?
デバッグにて変数を確認し、String等をいれてみても同じエラーが出る上
SQL文は他の部分で正常に動いているものをコピーしても同じエラーが出ます。

INSERT INTO テーブル...続きを読む

Aベストアンサー

SQLの問題ではありません。
これと同じです。

Dim s As String = ""
Dim i As Integer = 0

s = "aaa" + i + "bbb" '<--- ここでエラー


これを回避するには、
s = "aaa" + i.ToString + "bbb" 
又は、
s = "aaa" & i & "bbb"
です。

文字列の結合には、+ を使わずに & を使うことをお勧めします。

フィールド 要素はInt型ですので、
'" & point & "' の前後のシングルクォーテーションは不要です。


人気Q&Aランキング