C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法
ツリー表示
トピック表示
ランキング
記事検索
過去ログ
ログ内検索
キーワードを複数指定する場合は 半角スペース で区切ってください。
検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
[返信]をクリックすると返信ページへ移動します。
キーワード
/
検索条件
/
(AND)
(OR)
検索範囲
/
(現在のログ)
(全過去ログ)
(過去ログ1)
(過去ログ2)
(過去ログ3)
(過去ログ4)
(過去ログ5)
(過去ログ6)
(過去ログ7)
(過去ログ8)
(過去ログ9)
(過去ログ10)
(過去ログ11)
(過去ログ12)
(過去ログ13)
(過去ログ14)
(過去ログ15)
(過去ログ16)
(過去ログ17)
(過去ログ18)
(過去ログ19)
(過去ログ20)
(過去ログ21)
(過去ログ22)
(過去ログ23)
(過去ログ24)
(過去ログ25)
(過去ログ26)
(過去ログ27)
(過去ログ28)
(過去ログ29)
(過去ログ30)
(過去ログ31)
(過去ログ32)
(過去ログ33)
(過去ログ34)
(過去ログ35)
(過去ログ36)
(過去ログ37)
(過去ログ38)
(過去ログ39)
(過去ログ40)
(過去ログ41)
(過去ログ42)
(過去ログ43)
(過去ログ44)
(過去ログ45)
(過去ログ46)
(過去ログ47)
(過去ログ48)
(過去ログ49)
(過去ログ50)
(過去ログ51)
(過去ログ52)
(過去ログ53)
(過去ログ54)
(過去ログ55)
(過去ログ56)
(過去ログ57)
(過去ログ58)
(過去ログ59)
(過去ログ60)
(過去ログ61)
(過去ログ62)
(過去ログ63)
(過去ログ64)
(過去ログ65)
(過去ログ66)
(過去ログ67)
(過去ログ68)
(過去ログ69)
(過去ログ70)
(過去ログ71)
(過去ログ72)
(過去ログ73)
(過去ログ74)
(過去ログ75)
(過去ログ76)
(過去ログ77)
(過去ログ78)
(過去ログ79)
(過去ログ80)
(過去ログ81)
(過去ログ82)
(過去ログ83)
(過去ログ84)
(過去ログ85)
(過去ログ86)
(過去ログ87)
(過去ログ88)
(過去ログ89)
(過去ログ90)
(過去ログ91)
(過去ログ92)
(過去ログ93)
(過去ログ94)
(過去ログ95)
(過去ログ96)
(過去ログ97)
(過去ログ98)
(過去ログ99)
(過去ログ100)
(過去ログ101)
(過去ログ102)
(過去ログ103)
(過去ログ104)
(過去ログ105)
(過去ログ106)
(過去ログ107)
(過去ログ108)
(過去ログ109)
(過去ログ110)
(過去ログ111)
(過去ログ112)
(過去ログ113)
(過去ログ114)
(過去ログ115)
(過去ログ116)
(過去ログ117)
(過去ログ118)
(過去ログ119)
(過去ログ120)
(過去ログ121)
(過去ログ122)
(過去ログ123)
(過去ログ124)
(過去ログ125)
(過去ログ126)
(過去ログ127)
(過去ログ128)
(過去ログ129)
(過去ログ130)
(過去ログ131)
(過去ログ132)
(過去ログ133)
(過去ログ134)
(過去ログ135)
(過去ログ136)
(過去ログ137)
(過去ログ138)
(過去ログ139)
(過去ログ140)
(過去ログ141)
(過去ログ142)
(過去ログ143)
(過去ログ144)
(過去ログ145)
(過去ログ146)
(過去ログ147)
(過去ログ148)
(過去ログ149)
(過去ログ150)
(過去ログ151)
(過去ログ152)
(過去ログ153)
(過去ログ154)
(過去ログ155)
(過去ログ156)
(過去ログ157)
(過去ログ158)
(過去ログ159)
(過去ログ160)
(過去ログ161)
(過去ログ162)
(過去ログ163)
(過去ログ164)
(過去ログ165)
(過去ログ166)
(過去ログ167)
(過去ログ168)
(過去ログ169)
(過去ログ170)
(過去ログ171)
(過去ログ172)
(過去ログ173)
(過去ログ174)
(過去ログ175)
(過去ログ176)
(過去ログ177)
(過去ログ178)
(過去ログ179)
強調表示
/
ON
(自動リンクOFF)
結果表示件数
/
20件
30件
40件
50件
100件
記事No検索
/
ON
大文字と小文字を区別する
No.75940 の関連記事表示
ヒット / 10件
(1-10 を表示)
<<
0
>>
■75940
decimal以上の小数部を扱うには?
□投稿者/ nobb -
(2015/05/19(Tue) 18:19:27)
分類:[C#]
現在とある計算ツールを作成しています。
その中で、「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。
# この条件はお役所が決めたことですので変更できません。
30桁も必要なんて思ってもいなかったのでdecimalで事足りると踏んでいましたが、これのおかげでdecimalも危うくなっています。
C#においてdecimalの範囲以上の小数部の有効桁を実現するにはどの様な手段がありますでしょうか?
自分で調べたところ
http://www.tinyforest.gr.jp/mol/
こちらのライブラリの中にBigDecimalがあるので、
それを使えば実現できるかと思いますが、再配布ライセンスが若干お高いのと、BigDecimal以外が多すぎてもったいないと思っています。
何かいい手立てはありませんでしょうか?
環境:Visual Studio 2013 Update4、.NET Framwork 4.5、C#
親記事 /過去ログ128より /
関連記事表示
削除チェック/
■75941
Re[1]: decimal以上の小数部を扱うには?
□投稿者/ 魔界の仮面弁士 -
(2015/05/19(Tue) 19:27:15)
2015/05/19(Tue) 21:18:27 編集(投稿者)
■
No75940
(nobb さん) に返信
>「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。
10進数としての最大桁数は、Int64 で約18.9 桁、Decimal で約 28.8 桁ですので、
標準的な型では厳しいでしょうね。
かつての .NET 1.1 時代なら、J# の java.math.BigDecimal という逃げ道もありそうですが…。
実装の手間を無視しても良いのなら、桁数に制限の無い System.Numerics.BigInteger 構造体を使って、
計算処理は分数処理を実装、小数点表記への演算は「筆算」の要領で実装するとか。
たとえば
1/3 = 0.333333…
の結果の桁数を 10 桁まで保証するために、
あらかじめ分子を 「10000000000 倍した数」しておいて、整数除算で
10000000000/3 = 03333333333
と算出し、この結果を文字列加工して、1/10000000000 になる位置に
小数点を打ち直せば、"0.3333333333" という結果が得られそうです。
> BigDecimal以外が多すぎてもったいないと思っています。
GitHub に、幾つかの実装が上がっていました。
各ライセンスモデルは未確認な上、試してもいないのですが、一応参考までに。
https://github.com/VoltDB/voltdb-client-csharp/blob/master/VoltDB.Data.Client/Types/ThirdParty.BigDecimal.cs
https://github.com/SuprDewd/SharpBag/blob/master/SharpBag/Math/BigDecimal.cs
https://gist.github.com/nberardi/2667136
https://github.com/ckknight/ProjectEuler/blob/master/Ckknight.ProjectEuler/BigDecimal.cs
記事No.75940 のレス /過去ログ128より /
関連記事表示
削除チェック/
■75944
Re[2]: decimal以上の小数部を扱うには?
□投稿者/ nobb -
(2015/05/20(Wed) 09:22:06)
■
No75941
(魔界の仮面弁士 さん) に返信
ご回答ありがとうございます。
> 10進数としての最大桁数は、Int64 で約18.9 桁、Decimal で約 28.8 桁ですので、
> 標準的な型では厳しいでしょうね。
> かつての .NET 1.1 時代なら、J# の java.math.BigDecimal という逃げ道もありそうですが…。
1.1は使えないので、そういう過去もあったのか・・・と歴史として覚えておきます
> 実装の手間を無視しても良いのなら、桁数に制限の無い System.Numerics.BigInteger 構造体を使って、
> 計算処理は分数処理を実装、小数点表記への演算は「筆算」の要領で実装するとか。
>
> たとえば
> 1/3 = 0.333333…
> の結果の桁数を 10 桁まで保証するために、
> あらかじめ分子を 「10000000000 倍した数」しておいて、整数除算で
> 10000000000/3 = 03333333333
> と算出し、この結果を文字列加工して、1/10000000000 になる位置に
> 小数点を打ち直せば、"0.3333333333" という結果が得られそうです。
実装の手間は省けるものなら省きたいので知識として頭においておきます。
> GitHub に、幾つかの実装が上がっていました。
> 各ライセンスモデルは未確認な上、試してもいないのですが、一応参考までに。
>
https://github.com/VoltDB/voltdb-client-csharp/blob/master/VoltDB.Data.Client/Types/ThirdParty.BigDecimal.cs
>
https://github.com/SuprDewd/SharpBag/blob/master/SharpBag/Math/BigDecimal.cs
>
https://gist.github.com/nberardi/2667136
>
https://github.com/ckknight/ProjectEuler/blob/master/Ckknight.ProjectEuler/BigDecimal.cs
URLの提示ありがとうございます。
調べつつ適用できるか検討したいと思います。
BigDecimalでぐぐってみてはいたんですが、GitHubまではたどり着けませんでした。
後学のためにどのように検索したかお教えいただけませんか?
記事No.75940 のレス /過去ログ128より /
関連記事表示
削除チェック/
■75959
Re[3]: decimal以上の小数部を扱うには?
□投稿者/ 魔界の仮面弁士 -
(2015/05/20(Wed) 15:09:12)
■
No75944
(nobb さん) に返信
> BigDecimalでぐぐってみてはいたんですが、GitHubまではたどり着けませんでした。
> 後学のためにどのように検索したかお教えいただけませんか?
今回は
「BigDecimal C#」
「BigDecimal CS」
でしたね。
GitHub の他、Google Code Search や SearchCode.com の結果が含まれるようです。
> 整数部は1000未満(おそらく実際は200までいかない)の3ケタが必要で、
> 小数部は30ケタが欲しいので有効桁としては33ケタになるのでしょうか。
「固定小数点演算」が必要なのでしょうか。
「浮動小数点演算」が必要なのでしょうか。
固定小数点演算でよいのなら、各値の『小数点の位置』さえ揃えておけば、
BigInteger 構造体で処置できるように思います。
記事No.75940 のレス /過去ログ128より /
関連記事表示
削除チェック/
■75961
Re[4]: decimal以上の小数部を扱うには?
□投稿者/ nobb -
(2015/05/20(Wed) 15:43:48)
■
No75959
(魔界の仮面弁士 さん) に返信
ご回答ありがとうございます
> 今回は
> 「BigDecimal C#」
> 「BigDecimal CS」
> でしたね。
> GitHub の他、Google Code Search や SearchCode.com の結果が含まれるようです。
GitHubは表示されますが、その他の結果が出てこない・・・
検索結果が最適化されているせいでしょうか。いづれにせよお教え頂きありがとうございます。
> 「固定小数点演算」が必要なのでしょうか。
> 「浮動小数点演算」が必要なのでしょうか。
>
> 固定小数点演算でよいのなら、各値の『小数点の位置』さえ揃えておけば、
> BigInteger 構造体で処置できるように思います。
自分で実装する時間が惜しいので今回は先にご紹介いただいた
https://gist.github.com/nberardi/2667136/
こちらを使って対応する方向で考えます。
何度もご回答くださりありがとうございました。
記事No.75940 のレス / END /過去ログ128より /
関連記事表示
削除チェック/
■75943
Re[1]: decimal以上の小数部を扱うには?
□投稿者/ しま -
(2015/05/20(Wed) 02:25:01)
■
No75940
(nobb さん) に返信
> 現在とある計算ツールを作成しています。
> その中で、「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。
> # この条件はお役所が決めたことですので変更できません。
> C#においてdecimalの範囲以上の小数部の有効桁を実現するにはどの様な手段がありますでしょうか?
> 何かいい手立てはありませんでしょうか?
> 環境:Visual Studio 2013 Update4、.NET Framwork 4.5、C#
小数点以下30桁の意味するところがどこにあるのかがよく判りません。
第一、とてつもなく大きい数と、とてつもなく小さい数とを足したり、引いたりすれば
(1.0E29 - 1.0E-29 など)表現可能な桁数(仮数が) 60 桁以上なければ表現できないと思います。
更に、分数の結果といっても、絶対値で 1 未満の数値になる保障はないので整数部の桁数も含めて
有効桁数や、絶対値で最大の数値や絶対値で最小の数値をどこまで表現(又は保持)すべきなのかが
明らかでないと適切な数値の表現形式は探せないように思いますが、間違っていますか。
記事No.75940 のレス /過去ログ128より /
関連記事表示
削除チェック/
■75945
Re[2]: decimal以上の小数部を扱うには?
□投稿者/ nobb -
(2015/05/20(Wed) 09:34:20)
■
No75943
(しま さん) に返信
ご回答ありがとうございます。
多少読みづらくなるかもしれませんが細かく返信させて頂きます。
> 小数点以下30桁の意味するところがどこにあるのかがよく判りません。
これは私も分かりません。そこまで小さい値で何をしたいのでしょうか・・
しかし、そのような規程ですので対応できるのであれば対応せざるを得ないので泣く泣く質問させて頂きました。
> 第一、とてつもなく大きい数と、とてつもなく小さい数とを足したり、引いたりすれば
> (1.0E29 - 1.0E-29 など)表現可能な桁数(仮数が) 60 桁以上なければ表現できないと思います。
これは私が無知でした。
> 更に、分数の結果といっても、絶対値で 1 未満の数値になる保障はないので整数部の桁数も含めて
> 有効桁数や、絶対値で最大の数値や絶対値で最小の数値をどこまで表現(又は保持)すべきなのかが
> 明らかでないと適切な数値の表現形式は探せないように思いますが、間違っていますか。
仰る通りです。大変失礼いたしました。
とある2つの金額の分数という形になりますので、10倍以上の差は考えられない「だろう」と思っています。
ですので、整数部は1000未満(おそらく実際は200までいかない)の3ケタが必要で、小数部は30ケタが欲しいので
有効桁としては33ケタになるのでしょうか。計算も考えたら66ケタでしょうか・・・
記事No.75940 のレス /過去ログ128より /
関連記事表示
削除チェック/
■75953
Re[3]: decimal以上の小数部を扱うには?
□投稿者/ ピンフ -
(2015/05/20(Wed) 12:29:47)
> その中で、「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。
> # この条件はお役所が決めたことですので変更できません。
もし差し支えなければ、これが何の計算で、
どの所轄官庁からの通達なのかを教えて頂けますでしょうか?
もしかしたら、解決へのヒントが隠されているかも知れません。
記事No.75940 のレス /過去ログ128より /
関連記事表示
削除チェック/
■75955
Re[4]: decimal以上の小数部を扱うには?
□投稿者/ nobb -
(2015/05/20(Wed) 14:11:15)
■
No75953
(ピンフ さん) に返信
ご返信ありがとうございます。
> もし差し支えなければ、これが何の計算で、
> どの所轄官庁からの通達なのかを教えて頂けますでしょうか?
> もしかしたら、解決へのヒントが隠されているかも知れません。
業務にダイレクトで引っ掛かるので直接的な事は言えないのですが、、、
国土交通省から発表されるモノを受け県→市町村という形で下ってきます。
その中で国・県に関しては小数点以下30桁で、というような記述はなくとある市町村が独自に制定した模様です。
このような曖昧な表現でもよろしいでしょうか?
(禁止されてはいませんが)あまり公な場で業務の内容を書くのに抵抗がありまして・・・
# 個人的にお教えする手段があるのならお教えできますが・・・
記事No.75940 のレス /過去ログ128より /
関連記事表示
削除チェック/
■75972
Re[5]: decimal以上の小数部を扱うには?
□投稿者/ Jitta -
(2015/05/20(Wed) 22:22:24)
■
No75955
(nobb さん) に返信
解決しているようですが。
これ、「計算結果を表示する」だけでいいんじゃないの?
計算結果を、もう一度次の演算に使うのかな?
使わないなら、必要な時に計算して表示するようにすれば、30ケタだろうが40ケタだろうが、int(とstring)で十分ですよね。
記事No.75940 のレス / END /過去ログ128より /
関連記事表示
削除チェック/
<<
0
>>
パスワード/
-
Child Tree
-