痔になりやすい生活習慣とは?

SQLiteのREAL型についてC#プログラミングでfloat型として扱う場合に、
Insert文でREAL型に「9999999.999999」と値を入れた場合に
Select文で値を取得すると、「1E+07」で返ってきました。

「9999999.999999」という値で取得する方法がわからないためご教授いただきたいです。

申し訳ございませんが、よろしくお願いします。

A 回答 (2件)

http://msdn.microsoft.com/ja-jp/library/b1e65aza …
> 有効桁数: 7 桁

です。 9999999.999999 を入れようとしたら、途中で打ち切って概数にする必要があります。
9999999.999999 を有効数字7桁にするには、 9999999 で .999999 を四捨五入するとかする必要があります。
四捨五入すれば 10000000 です。
これは 1.0 * 10の7乗 であり、これを「指数表現」という方式で表現したのが 「1E+07」 です。

対策ですが
・C#でfloatを使うのなら、あきらめるしかありません。
・doubleを使うと、SQLiteのREALと同じ精度になります。
    • good
    • 0
この回答へのお礼

わかりやすいご説明ありがとうございました。
すごく参考になりました。

お礼日時:2014/12/18 00:18

情報が不足しすぎいます。


・C#で使っているSQLiteのドライバは何ですか?
System.Data.SQlite.dll ?
・INSERTはC#コードで実行していますか?
・SELECTはC#コードで実行していますか?
 また、そのコードはどのようなモノでしょうか?
 ↑C#でSELECTしているのであれば、ここの記述を
  間違えている可能性が高いでしょう
・コマンドラインなど別の方法で SELECTした場合の
 結果はどうなっていますか?
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

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

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

Qデータ型でFloatとreal の計算の違い?

教えてください。

ストアドでfloor(数量(reat) × 単価(money))=金額という計算をさせています。
そこで、200(コ)×9.4(円)=1879円と出るのです。floorで切り捨てても、1880円のはずです。flootなしでやっても、1879,9998と出ます。
何度入力しなおしても同じです。
Floatだと、1880となります。
他の計算はちゃんとできているようです(ざっと見た限りで100%確かめた訳ではありません)

理由がわからないのですが、教えてください。

Aベストアンサー

floatもrealもいわゆる概数といわれるデータ型で、小数の保持には必ず誤差が生じます。

一方、SQL Serverにはデータ型の優先順位というものがあります。
http://msdn.microsoft.com/ja-jp/library/ms190309.aspx

floatもrealもmoneyより上です。
したがって、float * money, real * moneyの演算を行うと、moneyはそれぞれfloat, realに変換されてから演算に使われます。
moneyで9.4と持っていたものがreal型に変換されると、結局9,4にはなりません。
おそらく9.399999389...あたりになってしまいます。realの有効桁数は7桁しかありませんから、小数点以下7桁目以降はアテにならない数字になります。
これに200を掛けても1879.999877..などとなるため、floorを掛けても1879になってしまいます。

floatも基本は同じですが、有効桁数が15桁あります。
moneyの9.4はおそらく9.40000000000004くらいの精度で変換されます。したがってfloorを掛けても1880と出ます。

しかし、誤差が上に出るか、下に出るかは扱う数字により保証の限りではありません。
したがって、real型やfloat型を金額計算に用いるべきではありません。
numeric(decimal)で計算すべきでしょう。

#質問者さんは結果をmoney型で受け取ろうとされているようです。

floatもrealもいわゆる概数といわれるデータ型で、小数の保持には必ず誤差が生じます。

一方、SQL Serverにはデータ型の優先順位というものがあります。
http://msdn.microsoft.com/ja-jp/library/ms190309.aspx

floatもrealもmoneyより上です。
したがって、float * money, real * moneyの演算を行うと、moneyはそれぞれfloat, realに変換されてから演算に使われます。
moneyで9.4と持っていたものがreal型に変換されると、結局9,4にはなりません。
おそらく9.399999389...あたりになってしまいます。r...続きを読む

QSqliteで使えない文字。

Sqlite3にて

列名やデータ内で使えない文字列(記号等の文字コード)を教えてください。

調べてみた情報では
改行や区切り文字などの基本的なことしか見つかりませんでしが

実際に使っていると、半角スペース等が混入している場合
全てではありませんが、データベース内で明らかに存在するのに検索できないなどの場合
があるようです。

一つずつ調べてエスケープ処理をすることは現実的に不可能なので
独自にエスケープ処理等を書かれている方に

どのような文字列をエスケープしていますでしょうか?

Aベストアンサー

「なでしこ」ですか、、、プリペアドステートメント-プレースホルダーにも対応していないのかな?

>データベース内で明らかに存在するのに検索できない
エスケープ処理よりも、文字コードの問題が大きいような気がします。
SQLiteは、SQL文内の文字列として解釈できれば、基本どんなバイナリーデータもそのまま受け入れてしまうのですけど、検索やソートの時に、sjis やeucでは、バイト列がずれてマッチしたりしてうまくいきません。
SQLite3 なら、utf-8には対応してるので、utf-8でなら概ねうまく検索されます。
「なでしこ」でどの文字コードが使われているのか解りませんが、utf-8で保存し、検索時のデータ指定もutf-8でSQL文を構築、取り出し後、表示用の文字コードに変換という手順が必要です。

エスケープ処理について、phpマニュアルでの、sqlite_ecsape_string() 関数(SQLite2用)の説明によれば、文字列データのくくりは、シングルクオート(')の方を使うようにし、データ内のシングルクオート(')は2重にしてるようです。たしか標準SQL規格準拠の動作。
そのほかのバイナリー文字は、たぶん バックスラッシュ(\ 0x5c) を付加かな。
でも、SQLite3では、プリペアドステートメント推奨となっています。

「なでしこ」ですか、、、プリペアドステートメント-プレースホルダーにも対応していないのかな?

>データベース内で明らかに存在するのに検索できない
エスケープ処理よりも、文字コードの問題が大きいような気がします。
SQLiteは、SQL文内の文字列として解釈できれば、基本どんなバイナリーデータもそのまま受け入れてしまうのですけど、検索やソートの時に、sjis やeucでは、バイト列がずれてマッチしたりしてうまくいきません。
SQLite3 なら、utf-8には対応してるので、utf-8でなら概ねうまく検索されます...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QSQLiteでフィールド名を得る方法はありますか?

c.execute('''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)''')
すると、date, trans, symbol, qty, price等のフィールドが用意されます。

c.execute("SELECT * FROM stocks")

すると、その登録内容を得ることが出来ます。

ところで、登録内容を得る前に、選ばれる対象となる"date","trans", ...等のフィールド名を得る方法はありませんか。

環境はWindows、Python 2.7です。

Aベストアンサー

cがsqlite3.Cursorだとして。

c.execute("SELECT * FROM stocks")
に成功した後で、c.descriptionを調べることでわかります。
http://docs.python.jp/2/library/sqlite3.html#sqlite3.Cursor.description

r=c.fetchione()
等としたときの r は sqlite3.Row のオブジェクトになります。
http://docs.python.jp/2/library/sqlite3.html#row
Rowにはkeysメソッドがあります
http://docs.python.jp/2/library/sqlite3.html#sqlite3.Row.keys

もし、簡単な参考書とかしか読んでいないのなら、公式マニュアルも読むことをお勧めします。


> 最初のRecord Setが(date,qty) = ("2014/12/1", 5)の場合

この例は「登録内容を得た後」だと思うのですが。
前と後、どちらなのでしょうか?

cがsqlite3.Cursorだとして。

c.execute("SELECT * FROM stocks")
に成功した後で、c.descriptionを調べることでわかります。
http://docs.python.jp/2/library/sqlite3.html#sqlite3.Cursor.description

r=c.fetchione()
等としたときの r は sqlite3.Row のオブジェクトになります。
http://docs.python.jp/2/library/sqlite3.html#row
Rowにはkeysメソッドがあります
http://docs.python.jp/2/library/sqlite3.html#sqlite3.Row.keys

もし、簡単な参考書とかしか読んでいないのなら、公式マニュアルも読むこ...続きを読む

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q英語で「個数」「件数」は?

質問は単純です。
英語で「個数」や「件数」をなんというか、です。

とりあえず、思いついたのは、numberでした。
たとえば、「りんごの個数」は"a number of apples"ですか?
でも、"a number of"は「いくつかの」という意味ですよね。

「データの件数」は"a number of data"でしょうか?

私は英語はほとんど出来ませんが、numberは「個数」というよりも「番号」という意味であるような気がしてなりません。

Aベストアンサー

>「個数」や「件数」をなんというか、です。
>とりあえず、思いついたのは、numberでした。
意外に思われるかもしれまんせんが、語の選択はnumberであっています、と思います。

>「りんごの個数」
the number of (the) apples

>「データの件数」
the number of (the) data

>numberは「個数」というよりも「番号」という意味であるような気がしてなりません。
実は、昔、私も、「個数や件数はなんていうのかな、え、number? え、本当?」と、奇異に感じたことを、思い出しました。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

QSQliteの日付検索について

SQliteの日付検索について教えてください。
現在、SQLiteでデータベースを作成しています。
日付で範囲を選択してデーターを抽出したいのですが、方法がよく分かりません。
(例:2011-08-20から2011-08-27までの日にち分のデータを抜き出したい)
どなたか教えてください。
ちなみにデータベースにはDATE型でdateのcolumに”2011-08-20”という風に保存してあります。

Aベストアンサー

SELECT * FROM テーブル名 WHERE date >= '2011-08-20' AND date <= '2011-08-27'
SELECT * FROM テーブル名 WHERE date BETWEEN '2011-08-20' AND '2011-08-27'

とかでどうでしょうか。


SQLite はDATE型で定義しても、実体は文字列(TEXT型)に
なっているのだと以前聞いたことがあります。


人気Q&Aランキング