| この記事の要点 |
|---|
|
エラーの状況
java.lang.ClassCastException:
java.math.BigDecimal cannot be cast to java.lang.String
at com.example.MyClass.process(MyClass.java:42)
// 典型的な発生コード
Object val = resultSet.getObject("price"); // NUMERIC → BigDecimal
String price = (String) val; // ← エラー
原因
BigDecimal クラスは String を継承していないので、強制キャストは不可。
対処方法
① toString() / toPlainString()
BigDecimal bd = new BigDecimal("12345.678");
// 標準
String s1 = bd.toString();
// → "12345.678"
// 大きい数値だと科学的記数法
BigDecimal big = new BigDecimal("1500000000");
System.out.println(big.toString());
// → "1500000000"
// 小さい数値
BigDecimal small = new BigDecimal("0.0000001");
System.out.println(small.toString());
// → "1E-7" ← 科学的記数法に!
// toPlainString で常に通常表記
System.out.println(small.toPlainString());
// → "0.0000001"
② String.valueOf()
String s = String.valueOf(bd);
// → bd.toString() と同じ、null セーフ (null → "null" 文字列)
// オブジェクトが null の場合の差
Object nullVal = null;
String s1 = String.valueOf(nullVal); // → "null"
String s2 = nullVal.toString(); // → NullPointerException
③ 桁数フォーマット
BigDecimal bd = new BigDecimal("1234.5678");
// 小数 2 桁に
String formatted = bd.setScale(2, RoundingMode.HALF_UP).toPlainString();
// → "1234.57"
// 3 桁区切り
NumberFormat nf = NumberFormat.getNumberInstance(Locale.JAPAN);
nf.setMaximumFractionDigits(2);
String s = nf.format(bd);
// → "1,234.57"
// 通貨形式
NumberFormat cf = NumberFormat.getCurrencyInstance(Locale.JAPAN);
String price = cf.format(bd);
// → "¥1,235"
// DecimalFormat
DecimalFormat df = new DecimalFormat("#,##0.00");
String s = df.format(bd);
// → "1,234.57"
逆方向: String → BigDecimal
// String → BigDecimal
BigDecimal bd1 = new BigDecimal("1234.567");
BigDecimal bd2 = new BigDecimal("0.0001");
BigDecimal bd3 = new BigDecimal("-99.99");
// 日本円や $ 等を含む場合は前処理が必要
String price = "¥1,234.50";
String cleaned = price.replaceAll("[¥,$,]", ""); // "1234.50"
BigDecimal bd = new BigDecimal(cleaned);
// null セーフ
public static BigDecimal toBigDecimal(String s) {
if (s == null || s.trim().isEmpty()) return null;
try {
return new BigDecimal(s.trim());
} catch (NumberFormatException e) {
return null;
}
}
// double → BigDecimal (誤差注意)
BigDecimal fromDouble = BigDecimal.valueOf(1.5); // ← 推奨
BigDecimal wrong = new BigDecimal(1.5); // → 1.5000000000000... 誤差
JDBC でのよくあるパターン
// DB の DECIMAL / NUMERIC カラム
ResultSet rs = ps.executeQuery();
while (rs.next()) {
// ❌ ダメ
String price = (String) rs.getObject("price");
// ✅ 良い
BigDecimal priceBd = rs.getBigDecimal("price");
String priceStr = priceBd.toPlainString();
// または getString (DB 側で文字列に変換)
String priceStr = rs.getString("price");
}
JPA / Hibernate でのマッピング
@Entity
public class Product {
@Id @GeneratedValue
private Long id;
@Column(precision = 10, scale = 2)
private BigDecimal price; // DB: DECIMAL(10,2)
}
// 利用
Product p = productRepository.findById(1L).orElseThrow();
String priceText = p.getPrice().toPlainString(); // "1234.50"
// DTO
public class ProductDto {
private Long id;
private String price; // 文字列で送る場合
public static ProductDto from(Product p) {
ProductDto dto = new ProductDto();
dto.id = p.getId();
dto.price = p.getPrice() != null ? p.getPrice().toPlainString() : null;
return dto;
}
}
JSON シリアライズ (Jackson)
// デフォルト: BigDecimal は数値として出力
ObjectMapper om = new ObjectMapper();
om.writeValueAsString(new BigDecimal("1234.5"));
// → "1234.5" (数値)
// 文字列として出力したい場合
om.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
// → "\"1234.5\""
// アノテーションで個別指定
public class Product {
private Long id;
@JsonSerialize(using = ToStringSerializer.class)
private BigDecimal price; // 文字列で出力
}
類似エラー
| エラー | 意味 |
|---|---|
BigDecimal cannot be cast to String | このページ (toString() / toPlainString() を使う) |
BigDecimal cannot be cast to Long | bd.longValueExact() でロング化 |
BigDecimal cannot be cast to Integer | bd.intValueExact() |
BigDecimal cannot be cast to Double | bd.doubleValue() |
Integer cannot be cast to BigDecimal | BigDecimal.valueOf(intVal) |
BigDecimal を扱う際のベストプラクティス
- 金額計算には BigDecimal: double / float は浮動小数点誤差で金銭計算に不適
- 等価比較は equals ではなく compareTo:
new BigDecimal("1.00").equals(new BigDecimal("1.0"))はfalse - 除算は MathContext or RoundingMode 必須:
bd1.divide(bd2, 2, RoundingMode.HALF_UP) - 不変オブジェクト: 演算結果は新インスタンス(
bd.add(other)は bd を変更しない) - 文字列化は toPlainString(): 科学的記数法を避ける
関連記事
子ページ
子ページはありません
同階層のページ
- java.lang.NoSuchMethodError
- java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
- java.lang.UnsupportedClassVersionError
- version less than X.X is not supported.
- パッケージ~は存在しません
- org.apache.jasper.JasperException: ...The jsp:param action must not be...
- java.io.FileNotFoundException: ファイル名 (許可がありません)
- java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
- 警告: この文字は、エンコーディング[文字コード]にマップできません
- java.text.ParseException: Unparseable date
- Unsupported major.minor version 52.0
- エンティティ" ... "への参照は';'デリミタで終了する必要があります。
- java.math.BigDecimal cannot be cast to java.lang.String
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38