- 締切済み
Pictureボックスに印刷プレビューを描いたとき
ピクチャーボックスコントロールにA4縦の印刷内容を70%の縮尺で印刷プレビューみたいな感じで描いたのですが、そのウインドウを開いたとき最大化にしてないと下の方までピクチャーに描かれません。ウインドウフォームのプロパティを開いたときに最大化に設定にしておくと下の方も全部描かれるのですが、ウインドウを最小化にした時にウインドウからはみでてしまう下の方が消えてしまいます。(最小化状態の見える部分だけ描かれるているようです。)どのようにしたらよいでしょうか? あと、これとは関係ないですが、VB6.0で切り捨て関数は何になりますか?(ROUNDは四捨五入でEXCELのVBと同じ様ですが、ROUNDDOWNは使えないのでしょうか?)初心者なものでよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- dsuekichi
- ベストアンサー率64% (171/265)
> なにせある設計の(役所に添付することもある)計算書 「正確さを要求される計算」なら、浮動小数型(SingleやDouble)は止めた方が無難でしょうね。 整数型(IntegerやLong)の範囲で計算させるか、通貨型(Decimal)や10 進型 (Decimal)で計算したほうが良いでしょうね。 #私もあまり詳しくありませんので、 #これ以上、続く場合、新たな質問にしてください。 #詳しい方がいても、題名が「Pictureボックスに印刷プレビューを描いたとき」では、読んでもらえないかもしれませんので。
- dsuekichi
- ベストアンサー率64% (171/265)
> 四捨五入・切捨ての記述をいれて検算してみたところ、 > 計算結果があうときもあるし、0.01の単位であわないこともあるようです。 > これが演算誤差でしょうか? 演算誤差もありますが、数値をVBがどう管理しているかの問題も関ってきます。 浮動小数型(Double型)は、内部では、値を2進数で管理しています。 その為、端数の処理方法の違いから、表示上(10進数表記)は切りの良い値なのに、内部で持っている値(2進数)が微妙にずれる場合があります、 この時、2進数(内部で持っている値)が、10進表記に値より、ちょっと小さいとかの場合、 四捨五入・切捨てを行うと、一挙に誤差が現れたりします。 #例えば、表示上は「0.05」なのに、内部的には「0.049999999999999996」だったりすると、 #小数点下2桁目で四捨五入すると、切り捨てられてしまいます。 Double型ではなく、内部的にも10進数で管理している、 通貨型(Decimal)や10 進型 (Decimal)を使うと、こういう誤差を少なくする事ができます。 #演算誤差は完全には無くせませんが・・・
お礼
計算するところの変数は見るとすべてSingleで今は書いている様です。なにせある設計の(役所に添付することもある)計算書なものでこの誤差はいいものかどうかもこの計算プログラムソフトを使用する人、つまり設計者の方(私ではない)に聞いてみないとこれもわかりません。。。現状は同じ計算をエクセルにさせてますが。。。VB6.0でも作ってみようと思ったのですが・・・・。通貨型(Decimal)や10 進型 (Decimal)に変えた方が無難なのでしょうかね・・・・?
- dsuekichi
- ベストアンサー率64% (171/265)
> VB6における、小数部分の四捨五入と切り捨ての関数の質問に変えさせていただきます。 別途質問をしていただいた方が良いのですが・・・ 基本的に、「算術計算」をして求めるしかありません。 #負の数の場合は省略します。 #また、例は、演算誤差対策やオーバーフロー対策をしていません。 小数部分の切捨ては、 (1)切捨て処理を行いたい桁が、小数第一位になるように桁をずらす。 (2)「Int、Fix 関数」で、切捨てを行う。 (3)もとの桁に戻す。 とします。 例: ---------------------------------------------------------------- Function kirisute(ByVal v As Double, Optional ByVal d As Long = 0) As Double kirisute = v * (10 ^ d) kirisute = Int(kirisute) kirisute = kirisute / (10 ^ d) End Function ---------------------------------------------------------------- 四捨五入も基本的は同じ考えで、 (1)切捨て処理を行いたい桁が、小数第一位になるように桁をずらす。 (2)0.5を加える。 (3)「Int、Fix 関数」で、切捨てを行う。 (4)もとの桁に戻す。 とします。 例: ---------------------------------------------------------------- Function shishagonyuu(ByVal v As Double, Optional ByVal d As Long = 0) As Double shishagonyuu = v * (10 ^ d) shishagonyuu = shishagonyuu + 0.5 shishagonyuu = Int(shishagonyuu) shishagonyuu = shishagonyuu / (10 ^ d) End Function ----------------------------------------------------------------
お礼
>「AutoRedraw プロパティ」をTrueにしても駄目ですか? きちんと表示されました。ありがとうございました。 四捨五入・切捨てについてもご丁寧に解説していただき感謝いたします。ありがとうございました。
補足
四捨五入・切捨ての記述をいれて検算してみたところ、計算結果があうときもあるし、0.01の単位であわないこともあるようです。 これが演算誤差でしょうか?難しいですね。。。EXCELでは関数があったので、はなにも考えなくて済みましたが(TT)
- dsuekichi
- ベストアンサー率64% (171/265)
> ウインドウを最小化にした時にウインドウからはみでてしまう下の方が消えてしまいます。 「AutoRedraw プロパティ」をTrueにしても駄目ですか? > VB6.0で切り捨て関数は何になりますか? 整数部分だけなら、「Int、Fix 関数」が使えるかもしれません。 ちょっと気になったので・・・ > (ROUNDは四捨五入でEXCELのVBと同じ様ですが、 > ROUNDDOWNは使えないのでしょうか?) ExcelのVBって、EexceVBAですか?ROUNDDOWNってありましたっけ・・・ それとも、Excelの組み込み関数のROUNDDOWNのことでしょうか? ちなみに、組み込み関数のROUNDと、ExcelVBAやVB6のRound関数は同じではありませんね。 「Excel組み込み関数のROUND」は「四捨五入」ですが、 「VB6やExcelVBAのRound関数」は、所謂『銀行型丸め』ですので、 例えばVB6で「Round(2.5)」は「2」になりますね。
補足
切り捨て部分は小数部分です。ROUND関数は『EXCEL』みたいです。全て一緒にして考えてしまってました。ご指導ありがとうございます。気づいてよかったです。 VB6の本にも丸めとあり四捨五入とは書いてありませんでした。 VB6における、小数部分の四捨五入と切り捨ての関数の質問に変えさせていただきます。「AutoRedraw プロパティ」については試してみてあとで御礼を投稿させていただきます。
お礼
タイトルと違う質問に変化してしまい申し訳ございませんでした。また、ご丁寧に対応していただきありがとうございます。 今度から一つの質問に一つのみします。 この誤差について使う方に伝え了解をいただけない場合は、新たに質問を掲載してみようと思います。(説明が難しいですが・・・(TT)) 大変お手数をおかけいたしました。